【发布时间】:2012-01-26 13:21:18
【问题描述】:
我见过:
!function(){ //code }();
在多个地方用于立即执行匿名函数。通常,它被用来代替:
(function(){ //code }())
有人知道! 是如何让函数执行的吗?
【问题讨论】:
-
值得指出的是,虽然前者有效,但它确实否定了函数返回的值,而第二种形式则没有。
标签: javascript
我见过:
!function(){ //code }();
在多个地方用于立即执行匿名函数。通常,它被用来代替:
(function(){ //code }())
有人知道! 是如何让函数执行的吗?
【问题讨论】:
标签: javascript
什么!会
当您使用! 时,该函数成为一元(逻辑)NOT 运算符的单个操作数。
这会强制将函数作为表达式求值,从而允许立即内联调用它。
其他选择
您几乎可以使用任何运算符来执行此操作。这里有一些例子......
'invoke',function(){ /*code*/ }();
1+function(){ /*code*/ }();
void function(){ /*code*/ }();
~function(){ /*code*/ }();
+function(){ /*code*/ }();
其中一些好处是运算符的含义没有被重载。
()的问题
当您在函数周围使用() 时,您可能会遇到一些错误,如果您连续有多个没有用分号分隔它们的错误。
(function() {
alert('first');
}())
(function() {
alert('second');
}())
// TypeError: undefined is not a function
这将导致TypeError,因为第二个函数周围的外部() 对将被解释为打算调用一个函数。第一个当然不会返回函数,因此您尝试调用undefined。
使用不同的运算符如何处理(或避免)问题
即使像+ 这样的运算符在某种程度上过载也不会导致错误。
如果你这样做......
+function() {
alert('first');
}()
+function() {
alert('second');
}()
第一个+被解释为一元+运算符,它转换第一个函数返回的结果,在本例中为undefined,因此它被转换为NaN .
第二个+ 将被解释为加法运算符,因此将尝试将NaN 添加到第二个函数的返回结果中,这里又是undefined。
结果当然是NaN,但它是无害的。没有非法代码会引发错误。
操作员如何与函数交互的演示
为了证明这一点,只需给每个函数一个返回值,然后将其粘贴到控制台中...
+function() {
alert('first');
return "10";
}()
+function() {
alert('second');
return 20;
}()
// 30
您将获得两个alerts,然后控制台将显示30,因为第一个+ 运算符将字符串"10" 转换为数字10,并添加了第二个+两个结果一起。
【讨论】:
! 是一个普通的逻辑否定。() 执行函数。
【讨论】:
! 前置到 function(){ //code }() (否则是一个错误)会导致匿名函数被执行。