[英]Functions that return functions in javascript
JavaScript中的Functions returning function可能有什么用?
例如參考下面的代碼
function a() {
alert('A!');
return function(){
alert('B!');
};
}
為了執行這兩個函數,我們將調用a()();
這種代碼構造有任何實際用途嗎? 忽略僅作為示例的alert()。
主要原因是要使用構造函數的范圍(查找“ closure”)來使用私有值來構建函數。 這是一個例子:
function makeIdMaker(){
var c = 0;
return function(){
return ++c;
}
}
var zebrasIdMaker = makeIdMaker();
console.log('id first zebra :', zebrasIdMaker()); // 1
console.log('id other zebra :', zebrasIdMaker()); // 2
這里的c
變量是“ private”:您只能將其遞增並獲得一個新值。 這也很方便,因為您可以將其作為事件處理程序傳遞(或在任何地方傳遞函數):
skipZebraIdButton.addEventListener('click', zebrasIdMaker); // click to increment the zebra counter
您也可以將此模式與IIFE結合使用。 這是一個真實的例子 :
// Visibility API helper
// var visible = vis(); // gives the current visibility state
// vis(someFunction); // registers a callback for visibility changes
var vis = (function(){
var stateKey, eventKey, keys = {
hidden: "visibilitychange",
webkitHidden: "webkitvisibilitychange",
mozHidden: "mozvisibilitychange",
msHidden: "msvisibilitychange"
};
for (stateKey in keys) {
if (stateKey in document) {
eventKey = keys[stateKey];
break;
}
}
return function(c) {
if (c) document.addEventListener(eventKey, c);
return !document[stateKey];
}
})();
IIFE返回此后將要使用的功能。 用於構建該函數的變量不會污染外部作用域。 由於在視覺上清楚地確定了函數的范圍,因此它通常也更具可讀性。
是的,有實際用途,例如bind
函數,該函數幾乎不用於指定執行上下文
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
完整的例子:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.