2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
!function跟(function(){... })();函數(shù)意義相同,叫做立即運(yùn)行的匿名函數(shù)(也叫立即調(diào)用函數(shù))。
js中可以這樣創(chuàng)建一個(gè)匿名函數(shù):
(function(){do something...})()
//或
(function(){do something...}())
而匿名函數(shù)后面的小括號(hào)()是為了讓匿名函數(shù)立即執(zhí)行,其實(shí)就是一個(gè)函數(shù)調(diào)用。
這樣寫會(huì)報(bào)錯(cuò):
function(){alert(1)}()
因?yàn)閒unction前面沒有(或者! ~之類的運(yùn)算符,js解析器會(huì)試圖將關(guān)鍵字function解析成函數(shù)聲明語句,而不是函數(shù)定義表達(dá)式。
作為組運(yùn)算符,小括號(hào)()會(huì)將其內(nèi)部的表達(dá)式當(dāng)成一個(gè)整體,然后返回結(jié)果,所以定義一個(gè)匿名函數(shù)正確的格式就是用小括號(hào)將函數(shù)體括起來。
同樣的! ~ + -等運(yùn)算符也有同樣的效果,這是因?yàn)槟涿瘮?shù)也是一種值,這些運(yùn)算符會(huì)將后面的函數(shù)體當(dāng)成一個(gè)整體,先對(duì)匿名函數(shù)進(jìn)行求值,然后在對(duì)結(jié)果進(jìn)行運(yùn)算。
不過這些運(yùn)算符雖然能夠達(dá)到讓匿名函數(shù)立即執(zhí)行的目的,但是要小心他們是有副作用的,比如:
!function() {return 1}()//false
~function() {return 1}()//-2
-function() {return false}()//0
-function() {return false}()//0
沒錯(cuò),他們會(huì)對(duì)函數(shù)的返回值進(jìn)行運(yùn)算,這樣可能會(huì)導(dǎo)致最終的結(jié)果和你想要的結(jié)果不一樣。當(dāng)然,對(duì)于那些沒有返回值的函數(shù)來說,當(dāng)然是沒有什么影響了。
擴(kuò)展資料:
匿名函數(shù)的調(diào)用:
var abc=function(x,y){
return x+y;
}
alert(abc(2,3)); // "5"
上面的操作其實(shí)就等于換個(gè)方式去定義函數(shù),這種用法是我們比較頻繁遇到的。
例如我們?cè)谠O(shè)定一個(gè)DOM元素事件處理函數(shù)的時(shí)候,我們通常都不會(huì)為他們定名字,而是賦予它的對(duì)應(yīng)事件引用一個(gè)匿名函數(shù)。
使用()將匿名函數(shù)括起來,然后后面再加一對(duì)小括號(hào)(包含參數(shù)列表)。
alert((new Function("x","y","return x*y;"))(2,3));// "6"

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
嘆號(hào)后面跟函數(shù)!function
和加號(hào)后面跟函數(shù)+function
都是跟(function(){})();這個(gè)函數(shù)是一個(gè)意思,都是告訴瀏覽器自動(dòng)運(yùn)行這個(gè)匿名函數(shù)的,因?yàn)?+()這些符號(hào)的運(yùn)算符是最高的,所以會(huì)先運(yùn)行它們后面的函數(shù)
- 2 回答
- 0 關(guān)注
- 463 瀏覽
添加回答
舉報(bào)