在javascript中使用函数返回函数有什么用?
例如,请参阅以下代码
function a() {
alert('A!');
return function(){
alert('B!');
};
}
要执行这两个功能,我们会调用a()();
这种代码构造是否有任何实际用途。忽略仅作为例子的alert()。
答案 0 :(得分:4)
主要原因是使用构造函数的范围(查找“闭包”)来使用私有值构建函数。这是一个例子:
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
变量为“私有”:您只能递增它并获取新值。它也很方便,因为你可以将它作为事件处理程序传递(或者在传递函数的任何地方):
skipZebraIdButton.addEventListener('click', zebrasIdMaker); // click to increment the zebra counter
您还可以将此模式与IIFE结合使用。这是一个real world example:
// 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返回之后我将使用的功能。用于构建该函数的变量不会污染外部范围。它通常更具可读性,因为功能构建明确具有视觉范围。
答案 1 :(得分:-1)
是的,有实际用途,例如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)));
};
};
完整示例: