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函数执行时的作用域链。
image.png
作用域链本质上是一个指向变量对象的指针列表。一般来说,函数执行完毕后,局部活动对象会被销毁。
在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。

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;

image.png
在匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。createComparisonFunction()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数在作用域链仍在引用这个活动对象。createComparisonFunction()的执行环境的作用域链会被销毁,但是它的活动对象仍留在内存中。
* 闭包只能取得包含函数中任何变量的最后一个值
* 闭包中使用this对象:全局函数中,this等于window,;当函数被作为某个对象的方法调用时,this等于那个对象;匿名函数的执行环境具有全局性。
* 内存泄漏。如果闭包的作用域链保存着一个HTML元素,该元素将无法被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值