【问题标题】:Placing arguments for anonymous functions in JavaScript在 JavaScript 中为匿名函数放置参数
【发布时间】:2013-04-01 17:09:50
【问题描述】:

当我像这样在 JavaScript 中创建匿名函数时:

(function(){
/* some code here */
})()

这个函数将被添加到哪个对象中,这个函数将存在于哪里?

您还可以在 jQuery 源代码中看到这样的匿名函数:

(function(window, undefined){
    /* some code here */
    })(window)

这个函数的参数如何与匿名的 0-arg 函数区分开来?

【问题讨论】:

  • 为什么这被否决了?

标签: javascript function anonymous-function anonymous


【解决方案1】:

JavaScript 中的函数是。也就是说,一个函数由一个对象表示,和任何其他对象一样,它可以是变量的值或参与表达式。

这样

(function() { ... })

是一个值,就像17"hello world" 是一个值一样。

当一个函数(作为一个值)出现在一个表达式中,并且其后跟 (...) 并且括号之间是逗号分隔的表达式列表时,这就是一个函数调用。

好的,所以:

(function() { ... })()

创建一个函数(作为一个值),然后不带参数调用该函数。函数对象,至少作为该代码的直接结果,不存储在任何地方。它在函数调用完成后基本上消失了,并且该子表达式的整体值将是函数返回的任何值。

将参数传递给这样的函数与将参数传递给任何其他函数没有什么不同。在您引用的具体示例中,目的是防止由错误的“外星人”代码引起的某些异常。你的例子真的应该这样写:

(function(window, undefined) {
  // code
})(this);

符号this 是保留字,其值完全受运行时控制。 (好吧,它在本地执行上下文中的值因此受到控制。)当在全局范围内评估时,上面的代码确保 inside 匿名函数,符号“window”将是对全球背景。这种结构对于可能在浏览器以外的上下文中使用的代码也很有用,例如 Node.js,其中全局上下文不称为“窗口”。

【讨论】:

  • 这个答案太好了,我现在明白了,你的解释太好了,非常感谢!
  • @user2162852 感谢您的夸奖!我很高兴你现在明白了。用 JavaScript 玩得开心!
【解决方案2】:

你给出的两个例子都是匿名函数,根据Wikipedia definition的第一行:

匿名函数 [...] 是定义的函数(或子例程),并且可能被调用,而不绑定到标识符

这些论点对匿名性没有影响。匿名函数可以接受 0, 1, 2, ... n 个参数,就像非匿名函数(即命名函数)一样。

匿名函数的一个主要优点是它们不必存在于任何地方——它们可以内联定义和使用,就像其他类型的其他值一样。

【讨论】:

    【解决方案3】:

    添加到@Pointy 的答案中添加参数到匿名函数没有任何区别

    (function(){
      /* some code here */
    })()
    
    (function(window,undefined){
      /* some code here */
    })(window)
    

    这两个函数在调用后都丢失了,唯一的区别是在第二个函数内部,一些变量或函数被存储在窗口上下文中,但匿名函数本身在调用后丢失了。

    如果需要保留对函数的引用,请尝试

    (window.myFunc = function(arg1, arg2, arg3) {
       /* your code here*/
    })(arg1, arg2, arg3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多