閉包的7種形式

2022-01-16 14:13:16 字數 1571 閱讀 2771

根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的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());//0

setvalue(1);

console.log(getvalue());//1

我們經常使用閉包來實現乙個累加器

var add = (function()

})();

console.log(add())//1

console.log(add())//2

類似地,使用閉包可以很方便的實現乙個迭代器

function setup(x)

}var next = setup(['a','b','c']);

console.log(next());//'a'

console.log(next());//'b'

console.log(next());//'c'

閉包的7種形式

根據閉包的定義,我們知道,無論通過何種手段,只要將內部函式傳遞到所在的詞法作用域以外,它都會持有對原始作用域的引用,無論在何處執行這個函式都會使用閉包。接下來,本文將詳細介紹閉包的7種形式 最常用的一種形式是函式作為返回值被返回 var f function return n console.log...

閉包的7種形式

最常用的一種形式是函式作為返回值被返回 var f function return n console.log f 一種變形的形式是將內部函式賦值給乙個外部變數 var inner var f function inner n f console.log inner 閉包可以通過函式引數傳遞函式的形...

閉包的概念 形式與應用

隨著硬體效能的提公升以及編譯技術和虛擬機器技術的改進,一些曾被效能問題所限制的動態語言開始受到關注,python ruby 和 lua 等語言都開始在應用中嶄露頭角。動態語言因其方便快捷的開發方式成為很多人喜愛的程式語言,伴隨動態語言的流行,我們經常聽到乙個名詞 閉包,很多人會問閉包是什麼?閉包是用...