• javascript闭包


    一、函数的执行顺序

    function定义的函数会被优先初始化,其他未直接使用function关键字定义的函数不会被优先初始化,例如匿名函数。

    参考代码

    fn1();
    //不会报错,对于通过function fn()这种写法来定义的函数,永远都会被最先初始化
    function fn1(){
        alert("fn1");
    }
    
    fn2();
    //使用如下方式定义函数,不会被先执行,如果在之前调用该函数就会报错
    /**
     * 以下函数的定义方式是先在内存中创建了一块区域,之后通过一个fn2的变量指向这块区域
     * 这块区域的函数开始是没有名称的,这种函数叫做匿名函数
     */
    var fn2 = function(){
        alert("fn2");
    }    

    二、函数的作用域

     在js中进行函数调用,会为每一个函数增加scope函数,通过这个属性来指向一块内存,这块内存保存了父函数的作用域以及自己的作用域,因此形成一个链式结构。

    参考代码1

    var showColor = function(){
      alert(this.color);
     }

    showColor中的scope变量指向的内存中包含两块作用域,分别是window和自己本身。

    参考代码2:

    function changeColor(){
      var anotherColor = "blue";
      function swapColor(){
       var tempColor = anotherColor;
       anotherColor = color;
       color = tempColor;
      }
      swapColor();
     }

    changeColor中的scope变量指向的内存中包含3块作用域,分别是window、changeColor和自己本身。

    参考代码3:

    compareObjectFunction函数执行之后,prop变量并没有消失,在返回的匿名函数中仍然可以访问,原因是匿名函数保存了父函数的作用域,这就是闭包

    function compareObjectFunction(prop){
        //匿名函数
        return function(obj1,obj2){
            if(obj1[prop] > obj2[prop]) return 1;
            else if(obj1[prop] < obj2[prop]) return -1;
            else return 0;
        }
    }
    var o1 = {name:"Leon",age:23};
    var o2 = {name:"Ada",age:28};
    //调用
    var compare = compareObjectFunction("name");
    //执行
    var re1 = compare(o1,o2);
    //输出
    alert(re1);

    三、块级用域

    1.js没有块级作用域,如果需要使用块级作用域则需要将全局变量的代码放到一个匿名函数中,并且马上调用匿名函数,这样也可以执行全局变量的代码。

    (function(){
     for(var i = 0; i < 10; i++){
     
     }
    })();

  • 相关阅读:
    Java里的时间类以及函数
    递归方法理解快速排序算法
    Java操作读取写入文本TXT及XML文件内容
    java控制Office套件API(POI加JXL)网上摘录留工作备查
    通过直接预分区的方式建表
    自用JavaMail实现
    阿里巴巴java开发手册学习记录,php版
    PHP 常用的header头部定义汇总
    这里有123个黑客必备的Python工具!
    PHP/JS中获取当前页面的完整URL
  • 原文地址:https://www.cnblogs.com/rigid/p/4301122.html
Copyright © 2020-2023  润新知