js中()是什么?作用是什么?

在js中常使用立即执行表达式,如:

(function(name){console.log(name)})("123")
// 输出"123"

虽然这种用法见得很多,但有点迷糊(function(){})中的()是什么?是一个操作符吗?它的作用又是什么?

阅读 5.1k
7 个回答
(function(name){console.log(name)})("123")

() 是为了消除歧义,因为如果不加(),会报错;

function(name){console.log(name)}("123")//Uncaught SyntaxError: Unexpected token (

为什么报错呢?

因为JavaScript 将function 关键字当作一个函数声明语句的开始,而函数声明语句 function 关键字后面应该是 函数名,这里后面跟圆括号,当然会报错

实际上,你在 function 后面加个名字,不加 () ,虽然不报错,也是达不到你想要的结果的,考虑下面代码:

function f(name){console.log('My'+name)}("123")//123

这里没有返回 My123 ,因为这只是一个函数声明语句后面,跟了一条毫无关系的表达式而已:("123"),如果要调用函数,除了通常的 f("123"),还可以在函数表达式后面加上("123"),这种情况下,你要告诉解析器,下面的代码是函数表达式,而不是语句:

function (name){console.log('My'+name)}
function f(name){console.log('My'+name)}

那么这个时候,() 就发生作用了,它可以消除歧义,让浏览器把() 里的内容当做表达式去解析:

(function (name){console.log('My'+name)})("123")//My123
(function f(name){console.log('My'+name)})("123")//My123

所以上面代码可以正常运行,并且取得预期效果,除此以外 () 提升优先级、执行函数以及其他效果我就不说了;

(function(name){console.log(name)}) 这个()是一个运算符,提高优先级的,先执行里面的代码块,形成一个函数,在执行这个函数

除了(),你还可以使用

+function(name){console.log(name)}("123")

-function(name){console.log(name)}("123")

!function(name){console.log(name)}("123")

0 || function(name){console.log(name)}("123")

等等等....

谢谢各位的认真解答,综合各位的答案,(function(){})中括号就是括号,它的作用是让浏览器把()里的内容当做表达式去解析,如果不用括号包起来的话,浏览器就会把function(){}当做是函数声明,但是函数声明没有名字,于是就会报错。

@hfhan 提到下面这几种方法也可达到立即执行函数的效果:

+function(name){console.log(name)}("123")

-function(name){console.log(name)}("123")

!function(name){console.log(name)}("123")

0 || function(name){console.log(name)}("123")

其中的+,-,!,0||等的作用应该也是让浏览器把function(){}当成表达式,而不是函数声明去处理。

再次感谢!

(function fun(a,b,c)
{
    //…
})(1,2,3)

这里的括号(1,2,3)中的参数对应的是前面函数的参数,当第一个括号的代码符合表达式规则时,前面的代码会被作为函数表达式来执行,所以最好在第一个函数表达式前面加上“;”分隔开,否则会报前一个表达式的值不是函数的错误。

如:alert(1)(function(){})(),此时alert(1)先执行,由于符合立即执行的函数表达式规则,所以alert(1)的返回值会被作为函数,同时将后一个括号中的值作为参数传入,但alert(1)返回的是undefined,所以会报错。解决办法就是在alert(1)后面加上“;”或者“,”,将其拆分为两个表达式。


立即执行还可以用

(function fun(a,b,c)
{
    //…
}(1,2,3))

!function fun(a,b,c)
{
    //…
}(1,2,3)

void function fun(a,b,c)
{
    //…
}(1,2,3)

调用运算符:跟在任何产生一个函数值的表达式之后的一对圆括号()
表达式内可包含零个或多个用逗号隔开的表达式。 每个表达式产生一个参数值

在 《JavaScript 语言精粹》里面,表示每个函数在创建时会附加两个隐藏属性,函数的上下文和实现函数行为的代码(JavaScript创建一个函数对象时,会给给对象设置一个“调用”属性)。当JavaScript调用一个函数时,可以理解为调用此函数的“调用”属性。 可以跟上面的 () 联系在一起。

你这段函数叫做自执行函数,程序运行到这个函数时会直接执行一次这个函数,后面的括号是传入的参数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题