【问题标题】:What is the benefit of assigning a self executing anonymous function to a variable in javascript?将自执行匿名函数分配给 javascript 中的变量有什么好处?
【发布时间】:2012-12-07 08:47:04
【问题描述】:

我正在阅读post about how to fire a function after a window resize was complete 并遇到了一些将自执行匿名函数分配给变量的示例:

var delay = (function(){
    var timer = 0;
    return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

$(window).resize(function() {
    delay(function(){
      alert('Resize...');
      //...
    }, 500);
});

与传统使用相比,使函数操作数自动执行有什么区别/好处?即

var delay = function() { ... 

【问题讨论】:

  • 创建一个新的作用域 :) 只有内部的function 的代码可以访问内部的timer 变量。提供一种非全局的方式来访问特定于通常在主函数范围之外的函数的变量。
  • @Ian 这应该是一个答案
  • @MrCode Ehh 另一个冲突,基本上有人已经发布了我所拥有的。而且我没有什么要补充的!我相信他们会这样做:) 谢谢!
  • 他的问题仍未得到解答。它不是关于“发生了什么”,而是“为什么分配”(翻译过来,“为什么要创建函数表达式而不是使用声明
  • @jAndy 我认为 为什么 得到了回答,不是吗?

标签: javascript anonymous-function


【解决方案1】:

主要原因是命名空间变量。函数引入了一个新的变量范围。在上面的例子中,timer 并没有破坏全局命名空间,同时仍然可供需要它的代码使用。


因为我显然需要澄清:

目标是在函数之外有一个变量:

var timer;

function delay() {
   // use timer
}

因为如果变量在函数内部,每次都会重新初始化。不过,我们希望在函数之外有一个持久值。

在上面的代码中,timer 是一个全局变量。我们不希望那样。为避免这种情况,我们将变量关闭在一个新范围内,以便delay 函数可以访问它,但不能全局访问:

var delay = (function () {
    var timer;

    return function () {
        // use timer
    };
})();

delay 现在和以前一样是一个函数,可以在其外部使用timer,但timer 不在全局范围内。

【讨论】:

  • 那么你是说如果函数不是自动执行的,timer 会在全局命名空间中?因为我刚试过: var f = function() { var v = 2; } 控制台.log(v);我得到一个错误“ReferenceError:找不到变量:v”
  • 在上述构造中,delay 是内部返回函数,而不是自执行函数。如果没有匿名函数,等价的将是var timer; function delay(...) { ... },这意味着timer 在全局命名空间中。
  • 但我不是在谈论匿名函数。我知道它引入了一个新的变量范围。我问的是自我执行部分。
  • 看看这个小例子。两个 bar 变量都无法从全局范围访问。自我执行似乎不会影响范围。 [链接]jsbin.com/oxikog/6/edit
  • 您“显然”不必做任何事情。另外,我认为您没有理解我的问题。我已经更新了 jsbin 以反映您上面的示例。我不是在谈论将变量计时器从delay 函数中拉出来。我说的是整个延迟函数是否自动执行的区别。 jsbin example
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 2015-04-12
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多