了解立即表達(dá)式前我們來回顧下函數(shù)表達(dá)式吧。定義函數(shù)的方式有兩種:一種是函數(shù)聲明,另一種就是函數(shù)表達(dá)式。我們最熟悉的函數(shù)表達(dá)式肯定是匿名函數(shù)賦值給變量栓辜。
var method = function(){
console.log("this is a function")
}
method() //this is a function
函數(shù)表達(dá)式不是我們的主角,在以上代碼中垛孔,匿名函數(shù)被賦值給了變量method,通過變量名+()就執(zhí)行了函數(shù)啃憎,這樣說你是不是發(fā)現(xiàn)了什么?變量名后面的()就是立即執(zhí)行表達(dá)式似炎,函數(shù)表達(dá)式+()就能立即執(zhí)行該函數(shù)(劃重點(diǎn))辛萍。對(duì)此我是這樣理解的(才疏學(xué)淺,理解錯(cuò)誤還請(qǐng)告知)
不管是函數(shù)申明還是函數(shù)表達(dá)式羡藐,都有一個(gè)函數(shù)名贩毕,這個(gè)函數(shù)名是函數(shù)在內(nèi)存中的地址,瀏覽器要執(zhí)行函數(shù)代碼需靠它尋址仆嗦,而()的功能就是告知瀏覽器辉阶,我要執(zhí)行這個(gè)函數(shù),麻煩你通過它的地址找到它并執(zhí)行代碼瘩扼。匿名函數(shù)并沒有將自己的地址告訴給任何變量谆甜,所以一般要調(diào)用匿名函數(shù)需要立即調(diào)用表達(dá)式。
大家再看看以下代碼
function(){
// write something here
}()
這里瀏覽器會(huì)報(bào)錯(cuò)<隆9嫒琛!
為什么呢栽燕?明明匿名函數(shù)可以將自己賦值給變量罕袋,那匿名函數(shù)不就相當(dāng)于會(huì)返回自己的地址么?其實(shí)不然碍岔,在var method = function(){ }
中浴讯, JavaScript 將 function 關(guān)鍵字當(dāng)作一個(gè)函數(shù)聲明的開始,而函數(shù)聲明后面不能跟圓括號(hào)蔼啦。然而榆纽,函數(shù)表達(dá)式的后面可以跟圓括號(hào)。要將函數(shù)聲明轉(zhuǎn)換成函數(shù)表達(dá)式,只要像下面這樣給它加上一對(duì)圓括號(hào)即可
(function(){
// write something here
})()
代碼中的一對(duì)括號(hào)就是將函數(shù)申明轉(zhuǎn)換為函數(shù)表達(dá)式奈籽,相同的功能還有亮元!,+唠摹,-,=奉瘤,這也解釋了為什么method是函數(shù)表達(dá)式了勾拉,因?yàn)?= 將匿名函數(shù)轉(zhuǎn)化為了函數(shù)表達(dá)式,值得注意的是在匿名函數(shù)賦值時(shí)不能使用+,-,!盗温,應(yīng)為他們會(huì)將函數(shù)表達(dá)式直接進(jìn)行類型轉(zhuǎn)換——NaN或false藕赞。
(function(a){
console.log(a); //firebug輸出1234,使用()運(yùn)算符
}(1234));
!function(a){
console.log(a); //firebug輸出12345,使用卖局!運(yùn)算符
}(12345);
+function(a){
console.log(a); //firebug輸出123456,使用+運(yùn)算符
}(123456);
-function(a){
console.log(a); //firebug輸出1234567,使用-運(yùn)算符
}(1234567);
那函數(shù)(匿名函數(shù))到底會(huì)不會(huì)返回值呢斧蜕?我試了下用console.log()輸出函數(shù),結(jié)果如下:
console.log會(huì)直接打印函數(shù)砚偶,匿名函數(shù)亦同
那直接將帶名的函數(shù)賦值會(huì)怎么樣呢批销?
將已經(jīng)申明的函數(shù)賦值給變量,就會(huì)發(fā)現(xiàn)函數(shù)申明中出現(xiàn)的函數(shù)名染坯,此處為d會(huì)無效均芽,但是查詢函數(shù)的名字,又是d单鹿。
(Firefox掀宋、 Safari、 Chrome 和 Opera 都給函數(shù)定義了一個(gè)非標(biāo)準(zhǔn)的 name 屬性仲锄,通過這個(gè)屬性可以訪問到給函數(shù)指定的名字劲妙。這個(gè)屬性的值永遠(yuǎn)等于跟在 function 關(guān)鍵字后面的標(biāo)識(shí)符。
//只在 Firefox儒喊、 Safari镣奋、 Chrome 和 Opera 有效
alert(functionName.name); //"functionName")
在以上代碼中我們可以發(fā)現(xiàn),函數(shù)申明的方式進(jìn)行函數(shù)表達(dá)式賦值怀愧,被申明的函數(shù)名(例如函數(shù)d)會(huì)無效化唆途,也就是函數(shù)表達(dá)式會(huì)直接將其視為匿名函數(shù),但是并不會(huì)更改函數(shù)的.name
屬性
總結(jié)
- 函數(shù)表達(dá)式:變量名 = 匿名函數(shù) >>> m = function(){}
- 立即執(zhí)行表達(dá)式 >>> (function())() 或 (function()())
- 匿名函數(shù)轉(zhuǎn)換為函數(shù)表達(dá)式:+掸驱,-肛搬,!毕贼,=温赔,()
- 已經(jīng)有名字的函數(shù)(有名函數(shù))和匿名函數(shù),直接打印會(huì)輸出函數(shù)本身及其代碼
- 直接將函數(shù)申明賦值給變量會(huì)將函數(shù)地址所有權(quán)轉(zhuǎn)讓給變量鬼癣,而函數(shù)名會(huì)失去函數(shù)表達(dá)式的功能
- 函數(shù)一旦被命名陶贼,函數(shù)名.name的值就固定了啤贩,不會(huì)改變(匿名函數(shù)屬于未命名狀態(tài))