我见过:
!function(){ //code }();
在多个地方使用以立即执行匿名功能。通常,它用于代替:
(function(){ //code }())
任何人都知道!
实际上如何使函数执行?
答案 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)
!
是一个普通的逻辑否定
()
执行该功能。