【发布时间】:2012-03-17 12:31:09
【问题描述】:
Bootstrap css 使用以下内容:
!function( $ ) {
}( window.jQuery )
这与我最初学习的自调用匿名函数调用不同:
(function($) {
})(jQuery);
问:你认为这只是偏好吗?我的意思是 not 符号,而不是用括号括起来。
【问题讨论】:
标签: javascript twitter-bootstrap
Bootstrap css 使用以下内容:
!function( $ ) {
}( window.jQuery )
这与我最初学习的自调用匿名函数调用不同:
(function($) {
})(jQuery);
问:你认为这只是偏好吗?我的意思是 not 符号,而不是用括号括起来。
【问题讨论】:
标签: javascript twitter-bootstrap
“问:你认为这只是偏好吗?”
是的,但是使用一元 ! 运算符,可以避免在 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'
}()
这个没有问题,因为! 是一个一元运算符,只计算其右侧的操作数。
【讨论】:
! 语法成为必要。反之亦然:使用! 运算符允许他们跳过分号。
(function(){}()) 与 (function(){})(); 相同。使用! 运算符只是意味着可以省略分组括号,因此它节省了单个字符。
() 的outer 集被解释 为调用运算符,并试图调用alert() 调用的返回值。 alert() 返回undefined,这就是你得到TypeError 的原因。我们可以去掉 trailing (),得到同样的错误。
以function 关键字开头的语句被视为函数声明,并且后面必须跟一个有效标识符的名称。
匿名函数表达式以单词function 开头,但由于没有名称,因此不能在可能与函数声明混淆的地方使用。大多数情况下,分组运算符用于表示函数表达式:
(function() {
/...
}());
或
(function() {
/...
})();
你也可以这样做:
var foo = function() {
}();
在上述所有内容中,function 关键字不在语句的开头,因此它被视为函数表达式的开头。不需要名称,可以立即调用该函数。
!function... 也一样。解析器看到! 并说“接下来是一个表达式”。当它到达function 时,它知道这是一个函数表达式的开始。
使用!function… 代替(function…) 可以节省单个字符,并且可能会造成一些混乱,因为这是编写函数表达式的一种不太常见的方式。
【讨论】: