? ? ? ? ? ? ? 概括:閉包就是一個函數(shù),捕獲作用域內(nèi)的外部綁定.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 官方定義:一個擁有許多變量和綁定了這些變量環(huán)境的表達式(通常是一個函數(shù)),因為這些變量也稱為了這表達式的一部分(閉包實現(xiàn)了全局變量的累加? 模塊化的代碼? 減少了全局變量的污染)。
? ? ? ? 自由變量和閉包的關(guān)系:自由變量閉合于閉包的創(chuàng)建。
? ? ? ? 自由變量:如果一個函數(shù)內(nèi)部有其他函數(shù),那么這些內(nèi)部函數(shù)就可以訪問外部函數(shù)中聲明的變量(這些變量就稱之為自由變量).
? ? 高階函數(shù):返回另一個函數(shù)的函數(shù)成為高階函數(shù)。
? ? ? ? ? 閉包的優(yōu)點:? 1.希望一個變量可以長期駐扎在內(nèi)存中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.避免全局變量的污染
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.私有成員的存在
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.私有成員的存在
? ? ? ? 閉包的缺點? ? :1.是常駐內(nèi)存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.會增大內(nèi)存的使用量,使用不當很容易造成內(nèi)容泄露
? ? ? 例:? ? function fn(){
? ? ? ? ? ? ? ? ? ? var a=10;
? ? ? ? ? ? ? ? function f1(){
? ? ? ? ? ? ? ? ? ? ? ? ? a++;
? ? ? ? ? ? ? console.log(a);
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? return f1;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? var f=fn();
? ? ? ? ? ? ? f();
? ? ? ? ? ? ? f();
? ? ? ? ? ? ? f();
? ? ? ? ? 閉包的特性: 1.函數(shù)嵌套函數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.函數(shù)內(nèi)部可以引入外部的參數(shù)和變量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.參數(shù)和變量不會被垃圾機制回收