闭包、匿名函数、函数声明

1、简单的描述闭包:如果在函数func内部声明函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。

(1)闭包是指:有权访问另一个函数作用域中的变量的函数。

创建闭包的方式:在一个函数内部创建另一个函数。 

(2)闭包与变量

作用域链引出的一个副作用:闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的变量。

function createFunctions(){
    var result = new Array();
    for(var i=0; i<10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result; 
}

看似函数应该会会返回一个函数数组,返回0,1,2,,,,实际上,因为每个函数的作用域链中都保存着 createFunction()函数的活动对象,变量的值是10,每个函数内部都是返回10。

我们可以通过创建另一个匿名函数强制让闭包的行为符合预期。

function createFunctions(){
    var result = new Array();
    for(var i=0; i<10; i++){
        result[i] = function(num){
            return function(){
                return num;
            }
        }(i);  //变量i的当前值复制给参数num,实现返回各个不同的值
    }
    return result;
}

(3)关于this对象

 this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。

闭包会携带包含他的函数的作用域,因此会比起亚函数占用更多的内存,过度的使用闭包可能会导致内存占用过多,故要慎用!

(4)例题 

function Foo() {
    var i = 0;
    return function() {
        console.log(i++);
    }
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();

// 0  1  0

闭包的用途:1、访问外部函数的变量。2、使外部函数被引用的变量一直保存在内存中。

这是一个闭包,闭包可以通过作用域链向上访问外层函数的变量和函数,同时闭包的作用域链上引用了外部函数的活动对象。

所以当f1();函数调用结束后,按道理来讲,这里的变量应该被回收,内存应该被释放,但由于外层函数的活动对象被子作用域链引用,一直保存在内存中,输出结果为0,之后i++ 变为1,当再次调用f1()时,存在于内存中的变量i=1,打印输出,不过变量i还一直存在,除非手动设置为i=null。

2、匿名函数:创建一个函数并将它赋值给变量。

如:var functionName = function(arg0,arg1,arg2){

             //函数体

};

3、函数声明----创建函数的一种方式

如:function sayHi(){

        alert("Hi!");

}

sayHi();

猜你喜欢

转载自blog.csdn.net/Judy_qiudie/article/details/82698979