今天是研究javascript的閉包問題,看到這麼一個非常好的文章
<a href="http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html?20110419152835">http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html?20110419152835</a>
文章最後留了兩個題目:
如果你能了解下面兩段代碼的運作結果,應該就算了解閉包的運作機制了。
代碼片段一。
var name = "the window";
var object = {
name : "my object",
getnamefunc : function(){
return function(){
return this.name;
};
}
alert(object.getnamefunc()());
代碼片段二。
var that = this;
return that.name;
這兩個例子相當精簡
這裡記錄下對這兩個例子的了解:
了解最後兩個例子:
1 函數中的this指的是調用這個函數的owner
2 object.getnamefunc()是傳回一個函數,并沒有執行函數中的代碼
3 增加一個例子0:
var name = "the window";
name : "my object",
return (this.name);
}
};
var name = object.getnamefunc();
alert(name);
4 把例子1變成
return this.name; //這個this是有上下文的限制的
var tmp = object.getnamefunc(); //此時沒有執行this.name
var name = tmp();//這個時候才執行,這時候的this上下文為全局
alert(name);
//alert(object.getnamefunc()())
5 把例子2變成:
var tmp = object.getnamefunc(); //這個時候執行了that = this,這裡的this上下文是object,是以that指的是object
var name = object.getnamefunc(); //這個時候執行了that.name
//alert(object.getnamefunc()());
這裡面最難了解的應該是this的上下文