關於 function 函數的總結

關於函數調用的問題:

function t() {
    console.log("1111");
    return 1111
}

add("transitionend", t) //調用整個函數 function t(){.....}
add("transitionend", t()) //調用函數返回的結果 1111
複製代碼

關於 !function(){} :當即調用函數

!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

關於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 函數。

相關文章
相關標籤/搜索