3 回答

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

TA貢獻1829條經(jīng)驗 獲得超6個贊
嘆號后面跟函數(shù)!function
和加號后面跟函數(shù)+function
都是跟(function(){})();這個函數(shù)是一個意思,都是告訴瀏覽器自動運行這個匿名函數(shù)的,因為!+()這些符號的運算符是最高的,所以會先運行它們后面的函數(shù)

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