1
// 因为返回的函数有权访问私有变量 `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 内部)
2018-09-29 提问
4 个回答
2

已采纳

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

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

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

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

2
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
0

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

0

新的 i, 新的 function

撰写答案

推广链接