JavaScript——第7章 函数表达式
- 函数声明提升
- 匿名函数形式
var functionName = function(arg0, arg1, ...)
创建一个函数并将它赋值给变量functionName。
7.1 递归
使用arguments.callee
避免原始函数指向变化后出错。arguments.callee指向正在执行的函数的指针。
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
}
console.log(factorial(5)); //120
但是在严格模式下,不能通过脚本访问arguments.callee。可以使用命名函数表达式来达到相同的结果。
var factorial = (function f(num){
if(num <= 1){
return 1;
}else{
return num * f(num - 1);
}
});
7.2 闭包
闭包:有权访问另一个函数作用域中的变量的函数。
MDN对闭包的解释
阮一峰的网络日志——学习JavaScript闭包
先看一个普通的compare函数
function compare(value1,value2){
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0
}
}
compare函数执行时的作用域链。
作用域链本质上是一个指向变量对象的指针列表。一般来说,函数执行完毕后,局部活动对象会被销毁。
在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。
function createComparisonFunction(prototypeName){
return function(object1,object2){ //匿名函数
var value1 = obj[prototypeName];
var value2 = obj[prototypeName];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0
}
}
}
var compare = createComparisonFunction("name");
var result = compare({name:"Nicholas"},{name:"Greg"});
//解除对匿名函数的引用,释放内存
compare = null;
在匿名函数从createComparisonFunction()
中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。createComparisonFunction()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数在作用域链仍在引用这个活动对象。createComparisonFunction()的执行环境的作用域链会被销毁,但是它的活动对象仍留在内存中。
* 闭包只能取得包含函数中任何变量的最后一个值
* 闭包中使用this对象:全局函数中,this等于window,;当函数被作为某个对象的方法调用时,this等于那个对象;匿名函数的执行环境具有全局性。
* 内存泄漏。如果闭包的作用域链保存着一个HTML元素,该元素将无法被销毁。
上一篇: 函数表达式
下一篇: JavaScript 函数表达式 闭包