• javascript从作用域链的角度看闭包


    闭包

    闭包是一个能访问外部函数定义的变量的函数。

    为什么?

    当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不再存在父作用域了,这就是作用域链。

    作用域链的顶端是全局对象。

    var color = 'blue'
    
    function getColor() {
        // 当前作用域不存在 color,父作用域是全局作用域
        return color
    }
    
    getColor() // 'blue'
    

      


    var color = 'blue'
    
    function getColor() {
        // 当前作用域存在 color
        var color = 'red'
        return color
    }
    
    getColor() // 'red'
    

     

    在看个加强版的demo。闭包能修改外部函数定义的变量。

    
    
    function createCounter(initial) {
      var counter = initial;
      function increment(value) {
        counter += value;
      }
      function get() {
        return counter;
      }
      return {
        increment: increment,
        get: get
      };
    }
    var myCounter1 = createCounter(100);
    var myCounter2 = createCounter(200);
    
    myCounter1.get(); // 100
    myCounter2.get(); // 200
    myCounter1.increment(2);
    myCounter2.increment(5);
    myCounter1.get() // 102
    myCounter2.get() // 205
    如下图myCounter1.get和myCounter2.get的函数对象拥有着一样的代码以及一样的属性值(name,length等等),但是它们的[[scope]]指向的是不一样的作用域对象

  • 相关阅读:
    poj 3320 Jessica's Reading Problem
    uva 120 C
    vim使用教程-转自
    2015 俄罗斯网络赛 D. Boulevard
    HTML转义字符大全
    介绍个好点的,JAVA技术群
    JAVA学习路线
    linux常用命令大全(转)好东西要分享
    Jqprint 轻量级页面打印插件
    hadoop集群搭建
  • 原文地址:https://www.cnblogs.com/BillyQin/p/10096459.html
Copyright © 2020-2023  润新知