zoukankan      html  css  js  c++  java
  • JavaScript闭包理解

    下面来自知乎的回答:

    作者:大水
    链接:https://www.zhihu.com/question/34547104/answer/59515735

    近似正确的短答案:闭包就是一个函数把外部的那些不属于自己的对象也包含(闭合)进来了。

    短答案:JavaScript中的闭包,无非就是变量解析的过程

    首先看一段话:
    每次定义一个函数,都会产生一个作用域链(scope chain)。当JavaScript寻找变量varible时(这个过程称为变量解析),总会优先在当前作用域链的第一个对象中查找属性varible ,如果找到,则直接使用这个属性;否则,继续查找下一个对象的是否存在这个属性;这个过程会持续直至找到这个属性或者最终未找到引发错误为止

    看个简单版的例子:

    (function(){
        var hello="hello,world";
        function welcome(hi){
            alert(hi);        //解析到作用域链的第一个对象的属性
            alert(hello);    //解析到作用域链的第二个对象的属性
        }
        welcome("It's easy");
    })();
    


    运行结果很简单,一个弹窗It's easy.一个弹窗hello,world。
    分析过程如下:
    对于函数welcome(),定义welcome的时候会产生一个作用域链对象,为了表示方便,记作scopechain。scopechain是个有顺序的集合对象。
    • scopechain的第一个对象:为了方便表示记作sc1, sc1有若干属性,引用本函数的参数和局部变量,如sc1.hi ;
    • scopechain的第二个对象:为了方便表示记作sc2,sc2有若干属性,引用外层函数的参数和局部变量,如sc2.hello;
    • ...
    • scopechain的最后一个对象:为了方便表示记作scn,scn引用的全局的执行环境对象,也就是window对象!,如scn.eval();

    这里之所以可以弹出hello,world,原因就是变量解析时在welcome函数作用域链的第一个对象上找不到hello属性,然后就去第二个对象上找去了(结果还真找到了)。

    所以,JavaScript中的所谓的高大上的闭包其实很简单,根本上还是变量解析。而之所以可以实现,还是因为变量解析会在作用域链中依次寻找对应属性的导致的。
  • 相关阅读:
    算法——排序方法总结(冒泡,快速,直接,希尔,堆,归并排序)
    C++函数调用之——值传递、指针传递、引用传递
    STM32(13)——SPI
    STM32(12)——CAN
    STM32(11)——DMA
    STM32(10)——窗口看门狗
    STM32(9)——通用定时器作为输入捕捉
    SRM32(8)——ADC和DAC
    WPF从入门到放弃系列第二章 XAML
    WPF从入门到放弃系列第一章 初识WPF
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7353831.html
Copyright © 2011-2022 走看看