欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript——第7章 函数表达式

程序员文章站 2022-03-18 19:14:39
...
  • 函数声明提升
  • 匿名函数形式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函数执行时的作用域链。
JavaScript——第7章 函数表达式
作用域链本质上是一个指向变量对象的指针列表。一般来说,函数执行完毕后,局部活动对象会被销毁。
在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。

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;

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