這道題目比較經典了:javascript
var a = 1; function test(){ a = 2; return function(){ console.log(a); } var a = 3; } test()();
當時我回答出來了正確答案,可是在一系列追問之下露出了狐狸的尾巴。答案是2java
我當時認爲test執行以後,a=2賦值給了全局,那麼返回function時那裏的a指的是window.a,就是2了。閉包
實際上var a=3這一句是陷阱。 因爲變量提高 a=2以前有一個var a的聲明,這裏的a變成了局部的值。函數
那麼返回函數爲何輸出2? 由於閉包,外層的變量對內部可見。this
var a = 1; function test(){ a= 2; return function(){ console.log(this.a); } var a = 3; } test()();
加大一下難度,這裏會輸出什麼呢?spa
因爲已經知道var a=3是陷阱,而javascript的函數this默認狀況是window,so答案是1.code
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ console.log(this.name); return function(){ console.log(this.name); }; } }; object.getNameFunc()();
這裏輸出是blog
My Objectip
The Window.作用域
閉包做用域在函數{}內,this在閉包內不能傳遞,改爲下面這樣才能都輸出My Object.
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ console.log(this.name); var tmp= this; return function(){ console.log(tmp.name); }; } };