链接,我之前做的两篇笔记js变量作用域,里面提到定义函数的不同方式,导致的变量声明提升问题。还有这篇js特殊的对象函数。
- 命名函数与匿名函数
- 以函数声明的方式声明命名函数
function f1(){
alert(1)
} - 以函数表达式的方式声明匿名函数
var f5=function(){
alert(f5);
} - 判断是否为匿名函数
FireFox、Safari、Chrome、Opera都给函数定义了一个非标准的name属性。
alert(f1.name);//f1
alert(f5.name);//""
但是IE不支持这个属性。 -
函数声明提升
之前写变量声明提升时,写的有有关函数部分的声明提升,有问题,不过已经更正了。
var met=true;
if(met){
function f3(){
alert(3);
}
}
else{
function f2(){
alert(2)
}
}
f2();//2
f3();//3
观察上述代码,初衷是希望根据met的值的情况来选择函数定义。
但是在if语句结束后,发现两个函数均可以被调用。
var met=true;
var ff;
if(met){
ff=function(){
alert(3);
}
}
else{
ff=function(){
alert(2)
}
}
ff();//3
使用函数表达式的方式,却很好的实现了函数初衷。
【结论】第一段代码函数声明提升后的效果为:
var met=true;
function f3(){
alert(3);};
function f2(){
alert(2)
};
if(met){}
else{}
f2();//2
f3();//3
会发现,if语句根本没有起到作用。 - 函数可以被删除么?
-
函数的删除
这篇文章说的很细。
delete操作符通常用来删除对象的属性,但是却不能删除变量,也不能删除函数。
function f1(){
alert(1)
}
alert(delete f1);//false
删除不成功则会返回false。
var met=true;
alert(delete met);//false
同理变量也是这样。
var obj={
name:"du",
age:19
}
alert(delete obj.name);//true
但是对象属性却可以。 -
指向空指针
function f1(){
alert(1)
}
var f6=f1;
f1=null;
f6();//1
f1();//error
将函数f1复制给f6,这时f6与f1都指向这个函数,此时让f1指向null,那么此时引用这个函数的引用类型变量只有f6。
【问题】函数不能被删除,那么如果这个函数不用了,他占得内存怎么释放?
js有一种内存清理机制,是可以根据函数在一段时间内被引用的次数来决定是否清理该函数对象所占的内存。
也就是说如果此时已经没有一个引用类型变量引用此函数,那么这个函数也就不可能再被引用,也就可能会被js释放这个函数对象所占内存。