根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的7種形式
最常用的一種形式是函式作為返回值被返回
var f = function() return n;}console.log(f()());
一種變形的形式是將內部函式賦值給乙個外部變數
var inner;var f = function();inner = n;
};f();
console.log(inner());
閉包可以通過函式引數傳遞函式的形式來實現
var inner = function(fn)var f = function()inner(n);
}f();
由前面的示例**可知,函式f()都是在宣告後立即被呼叫,因此可以使用iife來替代。但是,要注意的是,這裡的inner()只能使用函式宣告語句的形式,而不能使用函式表示式。詳細原因移步至此
function inner(fn)(function()
inner(n);
})();
在閉包問題上,最常見的乙個錯誤就是迴圈賦值的錯誤。關於其錯誤原因的詳細解釋移步至此
function foo()} return arr;
}var bar = foo();
console.log(bar[0]());//2
正確的寫法如下
function foo()})(i);
} return arr;
}var bar = foo();
console.log(bar[0]());//0
我們通過提供getter()和setter()函式來將要操作的變數儲存在函式內部,防止其暴露在外部
var getvalue,setvalue;(function()
setvalue = function(v)
}})();
console.log(getvalue());//0setvalue(1);
console.log(getvalue());//1
我們經常使用閉包來實現乙個累加器
var add = (function()})();
console.log(add())
類似地,使用閉包可以很方便的實現乙個迭代器
function setup(x)}var next = setup(['a','b','c']);
console.log(next());//'a'console.log(next());//'b'console.log(next());//'c'
閉包的7種形式
最常用的一種形式是函式作為返回值被返回 var f function return n console.log f 一種變形的形式是將內部函式賦值給乙個外部變數 var inner var f function inner n f console.log inner 閉包可以通過函式引數傳遞函式的形...
閉包的7種形式
根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的7種形式 最常用的一種形式是函式作為返回值被返回 var f function return n console.log...
閉包的概念 形式與應用
隨著硬體效能的提公升以及編譯技術和虛擬機器技術的改進,一些曾被效能問題所限制的動態語言開始受到關注,python ruby 和 lua 等語言都開始在應用中嶄露頭角。動態語言因其方便快捷的開發方式成為很多人喜愛的程式語言,伴隨動態語言的流行,我們經常聽到乙個名詞 閉包,很多人會問閉包是什麼?閉包是用...