關於閉包的理解
阿新 • • 發佈:2017-06-25
暴露 local 外部變量 setter setvalue 代碼段 ons 叠代器 console
閉包官方定義:閉包是指程序中有許多變量和綁定變量的執行環境。
本人自己理解:程序的代碼段允許存在一級函數並且一級函數不能被釋放,一級函數沒有釋放之前,外部可以使用一級函數的局部變量。
進一步理解 : 閉包就是外部可以使用局部變量。
閉包的功能:1、外部可以使用局部變量。
2、使函數不能釋放。
閉包的缺點:外部會修改局部變量,會大量占用內存,內存不會被釋放。
為什麽一級函數不能被釋放?
答:因為一級函數中有一個函數,這個函數使用了一級函數的變量,我們返回了這個函數並創建一個變量接收了。那麽這個函數就不會被js的垃圾回收機制銷毀。
最常用的一種形式是函數作為返回值被返回
varF = function(){ var b = ‘local‘; var N = function(){ return b; } return N; } console.log(F()());
一種變形的形式是將內部函數賦值給一個外部變量
var inner; var F = function(){ var b = ‘local‘; var N = function(){ return b; }; inner = N; }; F(); console.log(inner());
閉包可以通過函數參數傳遞函數的形式來實現
var Inner = function(fn){ console.log(fn()); } var F = function(){ var b = ‘local‘; var N = function(){ return b; } Inner(N); } F();
我們通過提供getter()和setter()函數來將要操作的變量保存在函數內部,防止其暴露在外部
var getValue,setValue; (function(){ var secret = 0; getValue = function(){return secret; } setValue = function(v){ if(typeof v === ‘number‘){ secret = v; } } })(); console.log(getValue());//0 setValue(1); console.log(getValue());//1
使用閉包可以很方便的實現一個叠代器
function setup(x){ var i = 0; return function(){ return x[i++]; } } var next = setup([‘a‘,‘b‘,‘c‘]); console.log(next());//‘a‘ console.log(next());//‘b‘ console.log(next());//‘c‘
謝謝大家
關於閉包的理解