2012-11-10 63 views
0

我使用函數表達式inneroneinnertwo聲明瞭兩個函數。我首先宣佈innerone然後innertwoinnerone裏面我打電話innertwo函數。但我擔心的是,我在innerone之後使用函數表達式宣佈innertwo,這意味着innertwo未被懸掛。那麼爲什麼這些功能按這個順序工作呢?是否必須改變他們的訂單?在使用函數表達式聲明它之前調用一個函數。爲什麼?

這裏是代碼

var one = function() { 
    var innerone = function() { 
     innertwo(); 
    }, 

    innertwo = function() { 
     console.log('innertwo'); 
    }; 

    return { 
     innerone: innerone 
    }; 
}; 

var o = new one(); 
o.innerone(); 
+3

它的工作,因爲你是調用'它被定義後innertwo'(當你調用'innerone')。如果你直接在'var innertwo = function()....之前調用'innertwo',它會拋出一個錯誤。 –

+0

它的工作原理是因爲當你創建對象的一個​​新實例並且'innerone'返回時'innertwo'已經存在。但我不認爲你應該使用'new',因爲它看起來你正在使用模塊模式,只需使用'var o = one()'。 – elclanrs

+0

爲什麼要放在第一位呢?有很多更清晰的方法可以得到相同的結果。 – jfriend00

回答

5

它的工作,因爲只有當你把它innerone被調用。當它被稱爲innertwo被定義。

0

你在你的評論中詢問了更簡單的編寫代碼的方法,所以這裏有幾個更簡單的方法。第一個仍然返回結構,可以作爲一個函數調用,沒有new。第二個將屬性添加到函數對象,但仍保留專用功能innertwo()。第二個選項對我來說看起來最清潔。

選項1:

function one() { 
    function innertwo() { 
     console.log('innertwo'); 
    } 

    return { 
     innerone: function() { 
      innertwo(); 
     } 
    }; 
} 

var o = one(); // new is not needed here 
o.innerone(); 

選項2:

function one() { 
    function innertwo() { 
     console.log('innertwo'); 
    } 

    this.innerone = function() { 
     innertwo(); 
    }; 
}; 


var o = new one(); 
o.innerone(); 
相關問題