JS高階 閉包

2022-03-28 11:39:43 字數 2756 閱讀 9732

當乙個巢狀的內部(子)函式引用了巢狀的外部(父)函式的變數(函式)時, 就產生了閉包(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 小明 分割線 高階函式 引數為函式 閉包 返回值為函式 裝飾器 返回值為...