几道很不错的作用域和闭包题

var a = 0,
      b = 0;
    function A(a) {
      A = function (b) {
        alert(a + b++);
      };
      alert(a++);
    }
    A(1);
    A(2);

输出结果为1和4.
重点思路是:A(1)调用A函数后,AO活动对象创建,这时只会有值为1的a这一个属性,作用域链为[AO,Global],于是程序接着运行,将挂载到全局对象Global上的A变为了fun(b),此时fun(b)的作用域链是[AO,Global].接着程序运行到alert(a),输出结果为1,a变为2;
A(2)运行后,调用A即function(b),又创建了一个活动对象我们命名为BO,只有值为2的b这一个属性,此时function(b)的作用域链为[BO,AO,Global],由于在当前作用域下没有a,也就是BO没有a属性,于是向AO查找,此时AO形成闭包对象,只对外提供a属性,此时a的值为2,于是BO拿到a的值为2,又因为b的值为2,所以alert(a+b++)的结果为4

function an(abn) {
      const a = 1;
      abn();
    }
    const a = 2;
    function abn() {
      console.log("a", a);
    }

    an(abn);
function fun(n, o) {
      console.log(o);
      return {
        fun: function (m) {
          return fun(m, n);
        }
      }
    }
    var a = fun(0);
    a.fun(1);
    a.fun(2);
    a.fun(3);
    var b = fun(0).fun(1).fun(2).fun(3);
    var c = fun(0).fun(1);
    c.fun(2);
    c.fun(3);
    }

版权声明:本文为jhyxz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。