首页 > JS一个立即执行函数表达式的疑问

JS一个立即执行函数表达式的疑问

// 如果你不在乎返回值,可以这么做
!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/

【热门文章】
【热门文章】