zoukankan      html  css  js  c++  java
  • 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,这个和原型链很相似

    Hold on, everything is possible.
  • 相关阅读:
    Office转SWF的一些感想(Office2007和Office2010)
    数据库字段为日期类型时
    C#实现office文档转换为PDF格式
    C#.net word excel powerpoint (ppt) 转换成 pdf 文件
    Servlet基础
    Android加速度传感器实现“摇一摇”,带手机振动
    android完全退出应用程序
    【安卓笔记】作为内部类的广播接收者
    Android中使用广播机制退出多个Activity
    [Android] ImageView.ScaleType设置图解
  • 原文地址:https://www.cnblogs.com/student-note/p/6207004.html
Copyright © 2011-2022 走看看