簡體   English   中英

返回javascript函數的函數

[英]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))); 
  }; 
}; 

完整的例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM