javascript --学习闭包,自由变量

  闭包

  下面是百度百科的解释:

    闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。

  也就是说一个代码块中使用了自由变量

var d=10;
    function df(){
    console.log(d);//这个时候d就是自由变量了
}

  那下面来看一个简单的闭包的例子:

let t1=(function d(){
    var dd=1;
    return function(){
        return dd++;
    };
})();//立即执行
console.log(t1());//1
console.log(t1());//2

  那为什么第一次和第二次方法的值会不同呢?

  其实正是因为在返回的函数中使用了一个自由变量,为了使用这个自由变量,编译器会

    >返回里面的那个里面方法,由于匿名方法里面有一个自由变量,就形成了闭包

    >退出匿名方法的上下文

    >保存function d(){}的执行上下文 

    >共享function d(){}的变量,这也是为什么第一次是1第二次是2了

 

   说到这里就有必要说下自由变量的作用域链

var d=10;
function fnd(){
    console.log(d);//10
};
(function(f){
    var d=20;
    f();//结果不出所料就是10
}(fnd));

  总结来说呢,就是自由变量要到创建它的作用域中去找-------------静态作用域

我们在看下一个例子

var a=10;
(function(){
    var b=20;
    return function(){
        console.log(b+a);//30
    }
}())();

  这个例子说明了,自由变量会一层一层的先上寻找,找到就返回,找不到就undefined,这个和原型链很相似

posted @ 2016-12-21 11:20  夏风微凉  阅读(538)  评论(0)    收藏  举报