【问题标题】:Not self invoking anonymous functions不是自调用匿名函数
【发布时间】:2012-03-17 12:31:09
【问题描述】:

Bootstrap css 使用以下内容:

!function( $ ) {
}( window.jQuery )

这与我最初学习的自调用匿名函数调用不同:

(function($) {
})(jQuery);

问:你认为这只是偏好吗?我的意思是 not 符号,而不是用括号括起来。

【问题讨论】:

标签: javascript twitter-bootstrap


【解决方案1】:

“问:你认为这只是偏好吗?”

是的,但是使用一元 ! 运算符,可以避免在 IIFE 之前忘记分号时出现一些错误,这可能导致 () 被解释为函数调用。

alert('foo')  // alerts 'foo'

(function() {  // TypeError: undefined is not a function
    alert('bar');
})()

这里的外部() 被解释为函数调用。它试图调用从 alert() 函数返回的任何内容,这当然返回 undefined,这不是一个函数。


alert('foo')  // alerts 'foo'

!function() {
    alert('bar');  // alerts 'bar'
}()

这个没有问题,因为! 是一个一元运算符,只计算其右侧的操作数。

【讨论】:

  • 哇。非常感谢“我不是”。
  • @cf_PhillipSenn 另请注意,Bootstrap (on purpose!) 不使用分号,这使得 ! 语法成为必要。反之亦然:使用! 运算符允许他们跳过分号。
  • 第二个例子根本不是类型错误,除非你省略了开始(和相应的结束)括号。 (function(){}())(function(){})(); 相同。使用! 运算符只是意味着可以省略分组括号,因此它节省了单个字符。
  • @RobG:我没有声明呼叫操作员在匿名函数上的正确位置。我所说的是()outer 集被解释 为调用运算符,并试图调用alert() 调用的返回值。 alert() 返回undefined,这就是你得到TypeError 的原因。我们可以去掉 trailing (),得到同样的错误。
  • 酷,完全错过了关于分号的那一点,一定是年纪大了。如果这是目的,我认为这不是一个好主意。最好修复错误而不是忽略它。
【解决方案2】:

function 关键字开头的语句被视为函数声明,并且后面必须跟一个有效标识符的名称。

匿名函数表达式以单词function 开头,但由于没有名称,因此不能在可能与函数声明混淆的地方使用。大多数情况下,分组运算符用于表示函数表达式:

(function() {
  /...
}());

(function() {
  /...
})();

你也可以这样做:

var foo = function() {
}();

在上述所有内容中,function 关键字不在语句的开头,因此它被视为函数表达式的开头。不需要名称,可以立即调用该函数。

!function... 也一样。解析器看到! 并说“接下来是一个表达式”。当它到达function 时,它知道这是一个函数表达式的开始。

使用!function… 代替(function…) 可以节省单个字符,并且可能会造成一些混乱,因为这是编写函数表达式的一种不太常见的方式。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多