鍍金池/ 問答/HTML/ js中()是什么?作用是什么?

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

在js中常使用立即執(zhí)行表達(dá)式,如:

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

雖然這種用法見得很多,但有點(diǎn)迷糊(function(){})中的()是什么?是一個(gè)操作符嗎?它的作用又是什么?

回答
編輯回答
過客

(function(name){console.log(name)}) 這個(gè)()是一個(gè)運(yùn)算符,提高優(yōu)先級(jí)的,先執(zhí)行里面的代碼塊,形成一個(gè)函數(shù),在執(zhí)行這個(gè)函數(shù)

除了(),你還可以使用

+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")

等等等....

2017年9月9日 18:16
編輯回答
單眼皮

調(diào)用運(yùn)算符:跟在任何產(chǎn)生一個(gè)函數(shù)值的表達(dá)式之后的一對(duì)圓括號(hào)()
表達(dá)式內(nèi)可包含零個(gè)或多個(gè)用逗號(hào)隔開的表達(dá)式。 每個(gè)表達(dá)式產(chǎn)生一個(gè)參數(shù)值

在 《JavaScript 語言精粹》里面,表示每個(gè)函數(shù)在創(chuàng)建時(shí)會(huì)附加兩個(gè)隱藏屬性,函數(shù)的上下文和實(shí)現(xiàn)函數(shù)行為的代碼(JavaScript創(chuàng)建一個(gè)函數(shù)對(duì)象時(shí),會(huì)給給對(duì)象設(shè)置一個(gè)“調(diào)用”屬性)。當(dāng)JavaScript調(diào)用一個(gè)函數(shù)時(shí),可以理解為調(diào)用此函數(shù)的“調(diào)用”屬性。 可以跟上面的 () 聯(lián)系在一起。
2017年12月11日 12:03
編輯回答
櫻花霓

你這段函數(shù)叫做自執(zhí)行函數(shù),程序運(yùn)行到這個(gè)函數(shù)時(shí)會(huì)直接執(zhí)行一次這個(gè)函數(shù),后面的括號(hào)是傳入的參數(shù)。

2018年1月11日 14:05
編輯回答
陪妳哭

謝謝各位的認(rèn)真解答,綜合各位的答案,(function(){})中括號(hào)就是括號(hào),它的作用是讓瀏覽器把()里的內(nèi)容當(dāng)做表達(dá)式去解析,如果不用括號(hào)包起來的話,瀏覽器就會(huì)把function(){}當(dāng)做是函數(shù)聲明,但是函數(shù)聲明沒有名字,于是就會(huì)報(bào)錯(cuò)。

@hfhan 提到下面這幾種方法也可達(dá)到立即執(zhí)行函數(shù)的效果:

+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||等的作用應(yīng)該也是讓瀏覽器把function(){}當(dāng)成表達(dá)式,而不是函數(shù)聲明去處理。

再次感謝!

2018年7月7日 17:45
編輯回答
膽怯

這個(gè)立即執(zhí)行也叫做“函數(shù)自執(zhí)行”
在百度搜索“函數(shù)自執(zhí)行”找到一篇文章,你看完后應(yīng)該明白了
雜七雜八JS :深入理解 函數(shù)、匿名函數(shù)、自執(zhí)行函數(shù) - CSDN博客
還有這一篇也能讓你明白
淺析Javascript匿名函數(shù)與自執(zhí)行函數(shù)

2017年4月24日 07:58
編輯回答
選擇
(function fun(a,b,c)
{
    //…
})(1,2,3)

這里的括號(hào)(1,2,3)中的參數(shù)對(duì)應(yīng)的是前面函數(shù)的參數(shù),當(dāng)?shù)谝粋€(gè)括號(hào)的代碼符合表達(dá)式規(guī)則時(shí),前面的代碼會(huì)被作為函數(shù)表達(dá)式來執(zhí)行,所以最好在第一個(gè)函數(shù)表達(dá)式前面加上“;”分隔開,否則會(huì)報(bào)前一個(gè)表達(dá)式的值不是函數(shù)的錯(cuò)誤。

如:alert(1)(function(){})(),此時(shí)alert(1)先執(zhí)行,由于符合立即執(zhí)行的函數(shù)表達(dá)式規(guī)則,所以alert(1)的返回值會(huì)被作為函數(shù),同時(shí)將后一個(gè)括號(hào)中的值作為參數(shù)傳入,但alert(1)返回的是undefined,所以會(huì)報(bào)錯(cuò)。解決辦法就是在alert(1)后面加上“;”或者“,”,將其拆分為兩個(gè)表達(dá)式。


立即執(zhí)行還可以用

(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)
2017年3月28日 23:41
編輯回答
離觴
(function(name){console.log(name)})("123")

() 是為了消除歧義,因?yàn)槿绻患?code>(),會(huì)報(bào)錯(cuò);

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

為什么報(bào)錯(cuò)呢?

因?yàn)镴avaScript 將function 關(guān)鍵字當(dāng)作一個(gè)函數(shù)聲明語句的開始,而函數(shù)聲明語句 function 關(guān)鍵字后面應(yīng)該是 函數(shù)名,這里后面跟圓括號(hào),當(dāng)然會(huì)報(bào)錯(cuò)

實(shí)際上,你在 function 后面加個(gè)名字,不加 () ,雖然不報(bào)錯(cuò),也是達(dá)不到你想要的結(jié)果的,考慮下面代碼:

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

這里沒有返回 My123 ,因?yàn)檫@只是一個(gè)函數(shù)聲明語句后面,跟了一條毫無關(guān)系的表達(dá)式而已:("123"),如果要調(diào)用函數(shù),除了通常的 f("123"),還可以在函數(shù)表達(dá)式后面加上("123"),這種情況下,你要告訴解析器,下面的代碼是函數(shù)表達(dá)式,而不是語句:

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

那么這個(gè)時(shí)候,() 就發(fā)生作用了,它可以消除歧義,讓瀏覽器把() 里的內(nèi)容當(dāng)做表達(dá)式去解析:

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

所以上面代碼可以正常運(yùn)行,并且取得預(yù)期效果,除此以外 () 提升優(yōu)先級(jí)、執(zhí)行函數(shù)以及其他效果我就不說了;

2018年9月14日 16:45