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

发布于 2022-09-01 07:42:08 字数 481 浏览 26 评论 0

// 如果你不在乎返回值,可以这么做
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

学习的时候,看了本站和一些第三方技术站的帖子,他们有的在文章中写到上面的代码。

我知道很多匿名都是以()来执行调用的。但为什么他们说如果不在乎返回值可以用! + ~ 这些符号。我不理解他们说的返回值是什么?

我第一反应是这样 !function(a) {alert(a)}(1000); 但在结果返回的是1000. 如果按照他们说的,不应该返回的是布尔值吗?为何是1000

所以到这里有些不太理解了。还请各位指定迷津。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

攒一口袋星星 2022-09-08 07:42:08

第一个问题,关于函数返回值:

(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
妄司 2022-09-08 07:42:08

!function(a) {alert(a)}(1000);
如同
function test(a){
alert(a);
}
test(1000)
只是不需要定义test函数

陌伤ぢ 2022-09-08 07:42:08

!function(a) {alert(a)}(1000)
函数运行的时候,会先运行到alter(a=1000),然后这个函数返回的是undefined(因为这个函数没有return任何东西),再!一下,就变成了true。

我喜欢麦丽素 2022-09-08 07:42:08

function前使用~ ! - +的目的是为了消除函数声明和函数表达式间歧义。

也就是说 function(){ /* code */ } 这是一个函数声明,如果直接在函数声明后使用 "()" 来调用, js 解析器无法解析,会提示:SyntaxError: unexpected_token 错误。

详细说明可以参考这篇文章:http://swordair.com/function-and-exclamation-mark/

南城旧梦 2022-09-08 07:42:08
# 两者执行结果相同,第二个是个闭包的匿名函数,自执行函数。
!function(a) {alert(a)}(1000)

(function(a) {alert(a)})(1000)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文