2010-02-15 34 views
1

我不完全確定「function x(){}」或「this.x = function(){}」之間的區別,但我必須製作一個面向對象的JavaScript,這樣的:Javascript function organization

function PROJECT(){ 
    ... 
    ... 
    ... 
    this.main_call=function(...){ return this.recursive_call(...); } 

    this.recursive_call=function(...){ 
    ... 
    var local,variables; 
    function helper(...,ref){ 
     ... 
     ref.recursive_call(...); 
    } 
    ... 
    helper(...,this); 
    ... 
    } 
} 
x=new PROJECT(); 
x.main_call(input); 

這裏我的問題是,這是否是良好的作風,或者如果有一些方法我可以調用輔助函數(這是用來停止一遍又一遍地重複相同的代碼),而沒有經過「這「指針。我有點擔心,因爲helper函數已經訪問了recursive_call中的所有局部變量,但是如果我嘗試直接訪問this.recursive_call,它會引發錯誤。我在嘗試聲明this.helper = function(...){...}時遇到了變量覆蓋的問題。

回答

0

我不太明白你在做什麼,但你可以改變你的關閉。這樣

function PROJECT(){ 

    this.main_call=function(){ 
    return recursive_call(); 
    } 

    var local,variables; 
    function helper() 
    { 
    recursive_call(); 
    } 

    function recursive_call(){ 
    helper(); 
    } 
} 
x=new PROJECT(); 
x.main_call(input); 

如果這東西不適合你需要做的,你可以隨時更改您的遞歸函數什麼是這樣的

this.recursive_call=function(...){ 
    ... 
    var local,variables; 
    var ref = this; 
    function helper(...){ 
     ... 
     ref.recursive_call(...); 
    } 
    ... 
    helper(...); 
    ... 
    } 
0

退房Learning Advanced JavaScriptJohn Resig

  1. 如果main_call只包裝recursive_call,則不需要。
  2. 對於幫助程序函數,請考慮在創建函數時使用函數閉包,以便在每次調用時都不會創建它們。
  3. 我個人更喜歡在助手中使用this而不是通過ref

    this.recursive_call=(function(){ 
        ... 
        function helper(...){ 
        ... 
        this.recursive_call(...); 
        } 
        return function(...) 
        ... 
        helper.call(this,...); 
        ... 
        }; 
    }).call(this); 
    

雖然它是一個更復雜一點,它讓this有用整個這感覺更OO給我。儘管你必須總是問自己你需要訪問哪些對象,在哪裏。如果它始終沒有意義,那麼它就沒用了,請不要使用它。 Revolution42answer就足夠了。

您可能還會考慮一些功能方面。例如,將幫助函數傳遞給recursive_call

0

你能不能把它變成了一會兒/ for循環?遞歸往往難以閱讀和維護(這可能是爲什麼你對當前的代碼感到不安)。您仍然可以擁有由this.helper()調用的helper()函數,但重複該過程的決定在循環邏輯中。