一种是函数声明;另一种是函数表达式。
函数声明提升:
say Hi();
function say Hi(){
alert("Hi!");
} //这个例子不会抛出错误,因为在代码执行之前会先读取函数声明。
匿名函数:var functionName=function(arg0,arg1,arg2){函数体};
sayHi(); //错误:函数还不存在
var sayHi=function(){
alert("Hi!");
};
//不要这样做 //可以这样
if(condition){ var sayHi();
function sayHi(){ if(condition){
alert("Hi!"); sayHi=function(){
}else{ alert("Hi!");
alert("Yo!"); };
} }else{
} alert("Yo!");
};
}
function factorial(num){ if (num <= 1){ return 1; } else { return num * factorial(num-1); //return num * arguments.callee(num-1);这是正确的 } } var anotherFactorial = factorial; factorial = null; alert(anotherFactorial(4)); //error!
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
function fn(PRopertyName){
return function(object1){
var v1 = object1[propertyName]; //访问了外部变量propertyName变量
}
}
function createFunctions(){
var result = [];
for(var i=0; i<10; i++){
result[i] = function(num){
return function(){
return num;
}
}(i);
}
}
var funcs = createFunctions();
for(var i=0; i<funcs.length; i++){
document.write(funcs[i] + ‘<br />’); //output 0,1,2,3…9
}
如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。
function assignHandler(){
var element = document.getElementById(‘someElement’);
var id = element.id;
element.onclick = function(){
alert(id);
};
element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存
}
如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。
function assignHandler(){
var element = document.getElementById(‘someElement’);
var id = element.id;
element.onclick = function(){
alert(id);
};
element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存
}
新闻热点
疑难解答