function t() {
console.log("1111");
return 1111
}
add("transitionend", t) //調用整個函數 function t(){.....}
add("transitionend", t()) //調用函數返回的結果 1111
複製代碼
!function跟(function(){... })();函數意義相同,叫作當即運行的匿名函數(也叫當即調用函數)。bash
js中能夠這樣建立一個匿名函數:函數
(function(){
do something...
})()複製代碼
//或ui
(function(){
do something...
}())
複製代碼
而匿名函數後面的小括號()是爲了讓匿名函數當即執行,其實就是一個函數調用。
spa
這樣寫會報錯:code
function(){
alert(1)
}()
複製代碼
由於function前面沒有(或者! ~之類的運算符,js解析器會試圖將關鍵字function解析成函數聲明語句,而不是函數定義表達式。
string
做爲組運算符,小括號()會將其內部的表達式當成一個總體,而後返回結果,因此定義一個匿名函數正確的格式就是用小括號將函數體括起來。it
一樣的! ~ + -等運算符也有一樣的效果,這是由於匿名函數也是一種值,這些運算符會將後面的函數體當成一個總體,先對匿名函數進行求值,而後在對結果進行運算。io
不過這些運算符雖然可以達到讓匿名函數當即執行的目的,可是要當心他們是有反作用的,好比:console
!function() {return 1}() //false
~function() {return 1}() //-2
-function() {return false}() //0
-function() {return false}() //0
複製代碼
沒錯,他們會對函數的返回值進行運算,這樣可能會致使最終的結果和你想要的結果不同。固然,對於那些沒有返回值的函數來講,固然是沒有什麼影響了。function
var i= 0;
function f(){
i++;
console.log("-------------: " + i)
return k;
function k(e) {
return e
}
}
f();
console.log("111111111111")
f()()
console.log(f()("I love you!"))
/*
執行結果:
-------------: 1
111111111111
-------------: 2
-------------: 3
I love you!
*/複製代碼
f 函數後面跟的小括號意義是 執行並返回 f 函數裏面 的k 函數。若是小括號裏面有值,會把 值賦值給 k 函數。