4 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(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ù)

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(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前面沒(méi)有(或者! ~之類的運(yùn)算符,js解析器會(huì)試圖將關(guān)鍵字function解析成函數(shù)聲明語(yǔ)句,而不是函數(shù)定義表達(dá)式。
作為組運(yùn)算符,小括號(hào)()會(huì)將其內(nèi)部的表達(dá)式當(dāng)成一個(gè)整體,然后返回結(jié)果,所以定義一個(gè)匿名函數(shù)正確的格式就是用小括號(hào)將函數(shù)體括起來(lái)。
同樣的! ~ + -等運(yùn)算符也有同樣的效果,這是因?yàn)槟涿瘮?shù)也是一種值,這些運(yùn)算符會(huì)將后面的函數(shù)體當(dāng)成一個(gè)整體,先對(duì)匿名函數(shù)進(jìn)行求值,然后在對(duì)結(jié)果進(jìn)行運(yùn)算。
不過(guò)這些運(yùn)算符雖然能夠達(dá)到讓匿名函數(shù)立即執(zhí)行的目的,但是要小心他們是有副作用的,比如:
!function() {return 1}()//false
~function() {return 1}()//-2
-function() {return false}()//0
-function() {return false}()//0
沒(méi)錯(cuò),他們會(huì)對(duì)函數(shù)的返回值進(jìn)行運(yùn)算,這樣可能會(huì)導(dǎo)致最終的結(jié)果和你想要的結(jié)果不一樣。當(dāng)然,對(duì)于那些沒(méi)有返回值的函數(shù)來(lái)說(shuō),當(dāng)然是沒(méi)有什么影響了。
擴(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ù)括起來(lái),然后后面再加一對(duì)小括號(hào)(包含參數(shù)列表)。
alert((new Function("x","y","return x*y;"))(2,3));// "6"

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
這種叫自執(zhí)行函數(shù)表達(dá)式
在這種情況下,解析器在解析function關(guān)鍵字的時(shí)候,會(huì)將相應(yīng)的代碼解析成function表達(dá)式,而不是function聲明。
// 下面2個(gè)括弧()都會(huì)立即執(zhí)行
(function () { /* code */ } ()); // 推薦使用這個(gè)
(function () { /* code */ })(); // 但是這個(gè)也是可以用的
// 由于括弧()和JS的&&,異或,逗號(hào)等操作符是在函數(shù)表達(dá)式和函數(shù)聲明上消除歧義的
// 所以一旦解析器知道其中一個(gè)已經(jīng)是表達(dá)式了,其它的也都默認(rèn)為表達(dá)式了
var i = function () { return 10; } ();
true && function () { /* code */ } ();
0, function () { /* code */ } ();
// 如果你不在意返回值,或者不怕難以閱讀
// 你甚至可以在function前面加一元操作符號(hào)
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
就是一個(gè)函數(shù)里的內(nèi)部函數(shù)。
只能在該函數(shù)內(nèi)部調(diào)用。
1234567 | function AA(){ function BB(){ alert(111); } BB(); } AA(); |
添加回答
舉報(bào)