// 如果你不在乎返回值,可以这么做
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
学习的时候,看了本站和一些第三方技术站的帖子,他们有的在文章中写到上面的代码。
我知道很多匿名都是以()
来执行调用的。但为什么他们说如果不在乎返回值
可以用!
+
~
这些符号。我不理解他们说的返回值是什么?
我第一反应是这样 !function(a) {alert(a)}(1000);
但在结果返回的是1000. 如果按照他们说的,不应该返回的是布尔值吗?为何是1000
所以到这里有些不太理解了。还请各位指定迷津。
# 两者执行结果相同,第二个是个闭包的匿名函数,自执行函数。
!function(a) {alert(a)}(1000)
(function(a) {alert(a)})(1000)
第一个问题,关于函数返回值:
(function(){
console.log('result')
})();
// result
// undefined
这个IIFE执行后,会log 字符串result,但是因为这个函数没有定义返回值,所以会返回undefined
第二个问题:
!function(a) {alert(a)}(1000);
上面的这个IIFE可以拆解为:
var temp = function(a) {
alert(a)
}
temp(1000);
因为你传入了1000,所以它会打印1000,但是因为这个函数依然没有返回值,所以会返回undefined
返回值和打印的结果不是一回事!
如果想看到被 !
作用后的结果,可以改写成这样
!function(a) {
alert(a);
return a;
}(1000);
// alert ==> 1000
// return ==> false
!function(a) {alert(a)}(1000);
如同function test(a){
alert(a);
}
test(1000)
只是不需要定义test函数
!function(a) {alert(a)}(1000)
函数运行的时候,会先运行到alter(a=1000),然后这个函数返回的是undefined(因为这个函数没有return任何东西),再!一下,就变成了true。
function前使用~ ! - +的目的是为了消除函数声明和函数表达式间歧义。
也就是说 function(){ /* code */ } 这是一个函数声明,如果直接在函数声明后使用 "()" 来调用, js 解析器无法解析,会提示:SyntaxError: unexpected_token 错误。
详细说明可以参考这篇文章:http://swordair.com/function-and-exclamation-mark/