2016-03-22 62 views
1

未定義的函數給定以下的Javascript例如:的Javascript內部模塊

var obj = function() { 
    var _c = function() { 
     console.log("c") 
    } 
    return { 
     a: function() { 
      b(); 
     }, 
     b: function() { 
      console.log("b"); 
     }, 
     c: function() { 
      _c(); 
     } 
    } 
}(); 

obj.a()調用給出了B不是限定的錯誤。通過將b()更改爲this.b()即可解決此錯誤。任何人都可以幫助解釋爲什麼這是必要的,而c可以訪問_c

+0

因爲'b'是一個屬性,而不是一個變量。 – Oriol

+0

沒有'函數b()',只有'{b:function(){}}'這是完全不同的,它是一個對象的屬性 – adeneo

回答

2

_c是在執行_c()時處於範圍內的局部變量。 b不是;它只能在物體本身上找到,因此可以通過this.b找到。

這種混淆意味着將面向對象的概念從其他語言移植到JavaScript。 JS中沒有私有和公共成員,您不能通過保留對象前綴來調用同一對象上的方法。只有局部變量(vvar vlet v),全局變量(v,當沒有var vlet v)和對象屬性(obj.prop)。方法是包含函數的對象屬性;不多也不少。

+1

好的解釋。值得一提的是,如果有一個全局函數「b」(儘管沒有調用OP期望的函數),那麼調用一個空的'b()'將會執行。另外,我認爲你的意思是'_c'是一個局部變量,當'c()'_ [not _'_c()'_] _is defined'_ [not _executed_];這實際上是一個閉包,這將是OP理解另一個很好的JS概念。 –

-1

你不應該直接調用b()。

var obj = function() { 
    var _c = function() { 
     console.log("c") 
    } 
    return { 
     b: function() { 
      console.log("b"); 
     }, 
     a: function() { 
      this.b(); 
     }, 
     c: function() { 
      _c(); 
     } 
    } 
}(); 
obj.a(); 

說明加入:
要調用的b(),其中b()在對象上定義的函數的內部。所以調用函數B()任何其他的功能裏面,你應該B鍵參照對象

this.b(); 
+0

這不回答「任何人都可以幫助解釋爲什麼這是必要的,而c可以訪問_c嗎?」 –

+0

@MobyDisk對不起,我忘了添加解釋。 –

0

需要使用this.b,因爲你是在這種情況下返回一個對象和「b」是該對象的屬性。您需要明確說明使用this

雖然_c是在閉包內定義的本地函數,但您可以直接在返回對象中訪問它,並且不會引用返回對象。