zoukankan      html  css  js  c++  java
  • 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++){
     
     }
    })();

  • 相关阅读:
    cocos2d-js 写日志log 查看日志log Android调试查看log
    嵌入式开发之hi3519---网络不通问题rmii
    嵌入式开发之视频压缩比---h264、mjpeg、mpeg4
    c、c++---linux上的GetTickCount函数
    嵌入式开发之hi3516---GV7601 SPI通信问题
    嵌入式开发之hisilicon---hi3536 处理器简介
    嵌入式开发之zynq---Zynq PS侧I2C驱动架构
    嵌入式开发值zynq---zynq中tlv320aic23b spi的驱动移植
    jumpserver 3.2修改排序规则
    haproxy 非常完整的配置
  • 原文地址:https://www.cnblogs.com/rigid/p/4301122.html
Copyright © 2011-2022 走看看