當乙個巢狀的內部(子)函式引用了巢狀的外部(父)函式的變數(函式)時, 就產生了閉包(closure)
使用chrome除錯檢視
理解一: 閉包是巢狀的內部函式
理解二: 包含被引用變數(函式)的物件
注意: 閉包存在於巢狀的內部函式中
函式巢狀
內部函式引用了外部函式的資料(變數/函式)
// 1. 將函式作為另乙個函式的返回值
function fn1()
return fn2;
}// 通過全域性變數引用, 保住了內部函式fn2的命
var f = fn1();
f(); // 11 在外部函式執行完成後, 還可以執行內部函式
// 2. 將函式的形參作為實參傳遞給另乙個函式呼叫
function logmsgdelay(msg, time) , time)
}
封閉作用域又稱值為封閉空間,還有乙個暱稱叫小閉包,以及匿名函式自調。
按鈕1
按鈕2按鈕3
/*封閉作用域又稱值為封閉空間,還有乙個暱稱叫小閉包,以及匿名函式自調。
寫法:(function(){})();
;(function(){})();
+(function(){})();
-(function(){})();
*/var btns = document.getelementsbytagname('button');
/*借助小閉包, 把每次迴圈的i值都封閉起來
*/for (var i = 0; i < btns.length; i++)
})(i);
}
作用域鏈條
js中有很多作用域, 比如: 全域性作用域 和 區域性作用域
凡是存在作用域的地方一定有作用域鏈條, 變數的查詢都是沿著這條鏈條自內而外的;
尋找變數都是遞迴遍歷尋找, 當前作用域找不到, 就跳到上乙個作用域遍歷尋找, 直至頂層;
作用域鏈條太長, 會影響程式執行效率
把一些不需要暴露在全域性的變數封裝成"私有變數"
mytool1.js
function mytool()
function send()
//向外暴露物件(給外部使用的方法)
return
}
呼叫
mytool2.js
;(function (window)
function send()
//向外暴露物件(給外部使用的方法)
window.mytool =
})(window);
/* 效能考慮, 作用域鏈條是遞迴查詢物件的
壓縮考慮, a,b,c,...
*/
呼叫
2個for迴圈,改為設定1個,根據下標清除
// window.onload = function () , 200);}*/
window.onresize = throttle(function () , 200);
function throttle(fn, delay)
}
缺點
函式執行完後, 函式內的區域性變數沒有釋放, 占用記憶體時間會變長
容易造成記憶體洩露
解決及時釋放
function fn1()
return fn2
} var f = fn1();
f();
f = null //讓內部函式成為垃圾物件-->**閉包
一種程式執行出現的錯誤
當程式執行需要的記憶體超過了剩餘的記憶體時, 就出丟擲記憶體溢位的錯誤
var arrobj = {};
for (var i = 0; i < 10000; i++)
占用的記憶體沒有及時釋放
記憶體洩露積累多了就容易導致記憶體溢位
常見的記憶體洩露:
1. 占用記憶體很大的全域性變數
2. 沒有及時清理的計時器/定時器
3. 閉包
// 2. 記憶體洩露
// 2.1 占用記憶體很大的全域性變數
/*var num = new array(9999999999999);
console.log(num);
*/// 2.2 沒有及時清理的計時器或**函式
/*var intervalid = setinterval(function () , 1000);
clearinterval(intervalid);
*/// 2.3 閉包
/*function fn1()
return fn2
}var f = fn1();
f();*/
// f = null
JS高階 閉包
基本概念 1 字面意思就是封閉包裹 乙個具有封閉的對外不公開的,包裹結構,或空間 2 js中的閉包就是函式 3 閉包的原理就是作用域訪問原則 上級作用域無法直接訪問下級作用域中的變數 4 閉包要解決的問題 閉包內的資料不允許外界訪問,要解決的問題就是間接訪問該資料 閉包基本模式 1 在外部函式 fo...
js高階之閉包
1.首先說下什麼是閉包,閉 封閉,包 就像我們的包包 雖然我在扯淡但是也有其道理咯,閉包就有點像j a裡面的封裝一樣,包屬性和方法都封裝到物件內部,在外部通過共有的get set方法獲取或者設定其值,但是js中不是這樣的,在js中是通過閉包的方式來實現的,閉包及在方法外部操作內部私有屬性和方法的方法...
高階函式 閉包
f用於 的格式化,內是變數或函式的某個形參 s這種格式化不行 def func name 小明 print f good morning,func def func name print f good morning,func 小明 分割線 高階函式 引數為函式 閉包 返回值為函式 裝飾器 返回值為...