在javascript中返回函数的函数

时间:2014-01-26 12:24:04

标签: javascript

在javascript中使用函数返回函数有什么用?

例如,请参阅以下代码

function a() {
alert('A!');
return function(){
alert('B!');
};
}

要执行这两个功能,我们会调用a()();

这种代码构造是否有任何实际用途。忽略仅作为例子的alert()。

2 个答案:

答案 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))); 
  }; 
}; 

完整示例:

http://ejohn.org/apps/learn/#86