2015-12-03 89 views
1

匿名函數/閉包應該保留創建它的對象的範圍嗎?爲什麼匿名函數會丟失對象範圍?

var myObject = { 
foo: "bar", 
func: function() { 
    var self = this; 
    console.log("outer func: this.foo = " + this.foo); 
    console.log("outer func: self.foo = " + self.foo); 
    (function() { 
     console.log("inner func: this.foo = " + this.foo); 
     console.log("inner func: self.foo = " + self.foo); 
    }()); 
} 
}; 
myObject.func(); 

這種方式產生相同的結果。

var myObject = { 
    foo: "bar", 
    func: function() { 
     var self = this; 
     console.log("outer func: this.foo = " + this.foo); 
     console.log("outer func: self.foo = " + self.foo); 
     return function() { 
      console.log("inner func: this.foo = " + this.foo); 
      console.log("inner func: self.foo = " + self.foo); 
     }; 
    } 
}; 
myObject.func()(); 

//輸出

outer func: this.foo = bar 
outer func: self.foo = bar 
inner func: this.foo = undefined 
inner func: self.foo = bar 
+0

人們似乎不僅僅是它「這種」基於@Josh Beam的答案。 – Vivek

回答

6

這只是JavaScript的(特別是ECMAScript5)的核心理念。匿名函數,特別是在閉包中,不保留上下文。

你可以做這樣的事情:

(function() { 
    console.log("inner func: this.foo = " + this.foo); 
    console.log("inner func: self.foo = " + self.foo); 
}).call(this); 

那是因爲你實際上調用該函數。如果您傳遞迴調,則可以使用Function.prototype.bind代替。

如果您使用ECMAScript6,您可以使用方向起着保持匿名回調的背景下:

(() => { 
    // `this` retains the context of its parent context 
}); 
+0

謝謝喬希。在玩了一下這個概念之後,我現在明白了。你有沒有參考資料,我可以深入研究這個問題。 – alknows

+0

@alknows沒問題,很高興這很有幫助:)這是我很久以前閱讀的一篇文章,我認爲它有一些體面的內容:http://javascriptissexy.com/understand-javascripts-this-with-clarity-and - 主 - 它/。另外,我建議閱讀完整鏈接的答案中的Function.prototype.bind頁面,並查看解釋箭頭函數的鏈接:https://developer.mozilla.org/en-US/docs /網絡/的JavaScript /參考/函數/ Arrow_functions。如果您需要其他資源,請告知我,我很樂意爲您提供幫助! –