我似乎無法讓我的頭繞過JavaScript變量範圍的特定情況。與我發現的其他示例和問題不同,我對嵌套函數的範圍感興趣。JavaScript本地範圍:var與此對比
我在this JSFiddle設置了一個例子。相關部分如下:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + self.a); // self.a = undefined
logMessage("self.b = " + self.b); // self.b = 2
}
}
現在,據我所知,對a
的引用直接起作用。 我也明白,消息3和4(this.a
和this.b
)將失敗,因爲this
引用內部函數。我也明白,第6行的作品,因爲我保存對原始對象的引用。
我不明白的是:
- 爲什麼沒有消息1和2都工作?
- 爲什麼消息5和6不能正常工作?
發揮他們爲什麼會工作的喜愛呢?好像你正在用類似於Java或其他語言的'this'命名空間是隱含的,JS不是這種情況。 – 2013-02-23 23:28:35
@FabrícioMatté我可能會無意識的這樣做(雙關語意)。我無法理解範圍是否應使變量/成員自動暴露給內部成員。它似乎並非如此,因爲它不一致。 – Alpha 2013-02-23 23:33:34
@Alpha您正在比較變量('var a = 5;')與非變量但對象屬性('this.b = 10;'設置'this'引用的對象的屬性'b'到'10')。這些事情是不一樣的,因此行爲不一樣。 – Niko 2013-02-23 23:35:52