4 回答

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

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

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

TA貢獻1851條經驗 獲得超5個贊
就是一個函數里的內部函數。
只能在該函數內部調用。
1234567 | function AA(){ function BB(){ alert(111); } BB(); } AA(); |
添加回答
舉報