鏈接,我之前做的兩篇筆記js變量作用域,里面提到定義函數(shù)的不同方式茵瀑,導(dǎo)致的變量聲明提升問(wèn)題。還有這篇js特殊的對(duì)象函數(shù)躬厌。
- 命名函數(shù)與匿名函數(shù)
- 以函數(shù)聲明的方式聲明命名函數(shù)
function f1(){
alert(1)
} - 以函數(shù)表達(dá)式的方式聲明匿名函數(shù)
var f5=function(){
alert(f5);
} - 判斷是否為匿名函數(shù)
FireFox马昨、Safari竞帽、Chrome、Opera都給函數(shù)定義了一個(gè)非標(biāo)準(zhǔn)的name屬性鸿捧。
alert(f1.name);//f1
alert(f5.name);//""
但是IE不支持這個(gè)屬性屹篓。 -
函數(shù)聲明提升
之前寫變量聲明提升時(shí),寫的有有關(guān)函數(shù)部分的聲明提升匙奴,有問(wèn)題堆巧,不過(guò)已經(jīng)更正了。
var met=true;
if(met){
function f3(){
alert(3);
}
}
else{
function f2(){
alert(2)
}
}
f2();//2
f3();//3
觀察上述代碼泼菌,初衷是希望根據(jù)met的值的情況來(lái)選擇函數(shù)定義谍肤。
但是在if語(yǔ)句結(jié)束后,發(fā)現(xiàn)兩個(gè)函數(shù)均可以被調(diào)用哗伯。
var met=true;
var ff;
if(met){
ff=function(){
alert(3);
}
}
else{
ff=function(){
alert(2)
}
}
ff();//3
使用函數(shù)表達(dá)式的方式荒揣,卻很好的實(shí)現(xiàn)了函數(shù)初衷。
【結(jié)論】第一段代碼函數(shù)聲明提升后的效果為:
var met=true;
function f3(){
alert(3);};
function f2(){
alert(2)
};
if(met){}
else{}
f2();//2
f3();//3
會(huì)發(fā)現(xiàn)焊刹,if語(yǔ)句根本沒(méi)有起到作用系任。 - 函數(shù)可以被刪除么?
-
函數(shù)的刪除
這篇文章說(shuō)的很細(xì)虐块。
delete操作符通常用來(lái)刪除對(duì)象的屬性俩滥,但是卻不能刪除變量,也不能刪除函數(shù)贺奠。
function f1(){
alert(1)
}
alert(delete f1);//false
刪除不成功則會(huì)返回false霜旧。
var met=true;
alert(delete met);//false
同理變量也是這樣。
var obj={
name:"du",
age:19
}
alert(delete obj.name);//true
但是對(duì)象屬性卻可以敞嗡。 -
指向空指針
function f1(){
alert(1)
}
var f6=f1;
f1=null;
f6();//1
f1();//error
將函數(shù)f1復(fù)制給f6颁糟,這時(shí)f6與f1都指向這個(gè)函數(shù),此時(shí)讓f1指向null喉悴,那么此時(shí)引用這個(gè)函數(shù)的引用類型變量只有f6棱貌。
【問(wèn)題】函數(shù)不能被刪除,那么如果這個(gè)函數(shù)不用了箕肃,他占得內(nèi)存怎么釋放婚脱?
js有一種內(nèi)存清理機(jī)制,是可以根據(jù)函數(shù)在一段時(shí)間內(nèi)被引用的次數(shù)來(lái)決定是否清理該函數(shù)對(duì)象所占的內(nèi)存勺像。
也就是說(shuō)如果此時(shí)已經(jīng)沒(méi)有一個(gè)引用類型變量引用此函數(shù)障贸,那么這個(gè)函數(shù)也就不可能再被引用,也就可能會(huì)被js釋放這個(gè)函數(shù)對(duì)象所占內(nèi)存吟宦。