zoukankan      html  css  js  c++  java
  • 一道闭包题引发的思考

    先看一下这个例子。

    function box() {
    var a = 1;
    return function() {
    a++;
    alert(a);
    }
    }
    box()();//2
    box()();//2
    var c=box();
    c();//2
    c();//3
    

    很久前在知乎碰到了这个问题,当时实在是不知道怎么完全解释,后来重新翻看《javascript高级程序设计》的时候才恍然大悟。

    我的理解是可以用执行环境来解释。

    《javascript高级程序设计》里面有这么一段话:“在js里面当执行流进入一个函数的时候,函数的环境会被推入到一个环境栈里面,函数执行结束后又会将环境弹出。”

    这样前两个box()()实际上每次执行的时候,函数环境都被推入到栈里面,结束后又会被弹出,首先是box环境被推入栈中,然后里面闭包函数环境推入到栈中,执行结束后会先弹出闭包的环境,再弹出box的环境,所以两个互不影响,都是2。

    但是c=box()的时候,因为c一直保持着box()的执行,所以box的执行环境一直在栈中,后面两个c()运行的时候,会推入闭包的执行环境,执行c()结束后才弹出闭包的执行环境,实际上box这个执行环境一直还在栈中,所以a就都在同一个执行环境里面了。

    后来我请教了一下在百度工作的师兄,他的解释是这样的:

    每个函数的作用域都是独一无二的,函数执行完后里面的东西都会清空,所以box()()执行两次后都是2。

    而c,即box(),实际是一直引用着box里面的a变量,所以一直不会被清空。

    这个类似于:

      var a=1;
      function c(){
       a++;
       alert(a);
      }
      c(); //2
      c(); //3
    树叶的一生,只是为了归根么?
  • 相关阅读:
    python爬取酷狗音乐
    python爬取酷我音乐
    排列组合+逆元模板
    python爬取QQVIP音乐
    一维数组的动态和
    买卖股票的最佳时机 II
    最佳买卖股票时机含冷冻期
    买卖股票的最佳时机
    子集
    最短无序连续子数组
  • 原文地址:https://www.cnblogs.com/INGP/p/6491099.html
Copyright © 2011-2022 走看看