究竟如何!function(){}()有效吗?

时间:2011-12-23 02:36:10

标签: javascript

我见过:

!function(){ //code }();

在多个地方使用以立即执行匿名功能。通常,它用于代替:

(function(){ //code }())

任何人都知道!实际上如何使函数执行?

2 个答案:

答案 0 :(得分:38)

什么!确实

使用!时,该函数将成为一元(逻辑)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添加到第二个函数的返回结果中,这又是{ {1}}。

结果当然是undefined,但它是无害的。没有非法代码可以抛出错误。


演示操作员如何与功能互动

为了证明这一点,只需给每个函数一个返回值,然后将其粘贴到控制台中......

NaN

您将获得两个+function() { alert('first'); return "10"; }() +function() { alert('second'); return 20; }() // 30 ,然后控制台将显示alert,因为第一个30运算符会将字符串+转换为数字{{1}第二个"10"将两个结果加在一起。

答案 1 :(得分:2)

!是一个普通的逻辑否定 ()执行该功能。