閉包1:嵌套的兩個作用域中 內層作用域訪問外層作用域 局部變量的 過程
閉包2 : 就是能夠訪問其他函數內部變量的函數;
由於js中只有函數內部的子函數才能訪問局部變量,所以可以簡單的把閉包理解為"定義在函數內部的函數";
本質上閉包就是連接函數內部和外部的一座橋梁;
閉包的作用:可以讓我們利用函數的作用域保存一些我們需要的變量
1.可以解決定時器中無法保存變量的問題 2.節約代碼量
閉包特點:延展了函數的作用域 (可以在函數外部讀取成員函數內部)
閉包函數不會被輕易釋放 (讓函數始終存活在內存中)
閉包的缺點: 占用內存
//j定時器 for(var i=0; i<3; i++){ setTimeout(function(){ console.log(i); },0) } // 4 4 4 4
瀏覽器執行代碼順序: 先執行棧中的代碼, 再執行任務隊列中的代碼
執行棧: script 標簽中的代碼
任務隊列: 定時器中的函數代碼 綁定的事件函數代碼
所以, 定時器中的代碼要等到 for循環完成之后再執行
//閉包中 this 的指向問題
var name = "The Window"; var obj = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; console.log(obj.getNameFun()() ); //the window
//1. 定義變量 that 來存儲 this的值
var obj = {
name = 'the pbj',
getNameFunc: function () {
var that = this; return function () { return that.name; }; }
};
console.log(obj.getNameFun()() ); //the obj
//2. 利用bind(this), 將this指向obj
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
}.bind(this);
}
};
console.log(object.getNameFunc()()); //the obj
