下面js代码,为什么counter和counter2 都有私有的作用域 i?

// 因为返回的函数有权访问私有变量 `i`

  function makeCounter() {
    // `i` 只能在 `makeCounter`内被访问.
    var i = 0;

    return function() {
      console.log( ++i );
    };
  }

  // 注意 `counter` 和 `counter2` 都有私有的作用域 `i`.

  var counter = makeCounter();
  counter(); // logs: 1
  counter(); // logs: 2

  var counter2 = makeCounter();
  counter2(); // logs: 1
  counter2(); // logs: 2

  i; // ReferenceError: i 未定义 (只存在 makeCounter 内部)
阅读 3.1k
4 个回答

counter === counter2 会得到 false,他们根本是两个不同的函数,只不过行为一致。

抛开 return 语句不看,makeCounter() 每次运行的时候会产生一个局域变量 i,所以多次运行的 i 并不是同一个变量。局部变量,这个好理解吧?

同理,每次 return 后面的 function 也是局部引用的,每次调用 makeCounter() 都会产生不同的函数表达式对象。由于每次产生的函数和对应的 i 在同一个作用域,所以这个函数可以访问对应的 i

return 的结果是把函数表达式的引用返回出来,分别由 countercounter2 两个变量存储了,所以 countercounter2 指向的是同不的函数表达式对象,而它们使用的 i 也是不同的。

makeCounter()==makeCounter() //false

var a = makeCounter(); 
a() //这时 执行了 return 里的`function`,在a这个作用域里,i+1,然后i=1;当你再次访问`a()`的时候,你访问的还是上次那个。
 makeCounter() //如果不赋值,直接执行,他没有变量承接,你没法继续访问这个作用域的变量

你每执行 makeCounter() ,他都是一个新的相同的方法,但里面变量作用域也是新的,你已经没有办法访问到。

打个比方:

    var obj = {};
    var obj1 = {};
    var obj2 = obj;
    
    obj == obj1 //false
    obj == obj2 //true

看起来并不是这样,应该是每次调用makeCounter方法时变量i都被重新赋值了的样子

新的 i, 新的 function

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题