【问题标题】:Why do javascript variables in closure functions not reset to a default when called multiple times?为什么闭包函数中的javascript变量在多次调用时不会重置为默认值?
【发布时间】:2013-06-28 17:11:10
【问题描述】:

请有人在下面的代码中向我解释为什么多次调用counter 会导致每次调用i 的值都会增加?

我的理解是,由于我们在makeCounter中专门设置了i = 0;,所以每次通过counter变量调用makeCounter时,i应该重置为0。我不明白为什么这不是案例。

function makeCounter() {
  // `i` is only accessible inside `makeCounter`.
  var i = 0;

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

// Note that `counter` and `counter2` each have their own scoped `i`.

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

【问题讨论】:

    标签: javascript closures scope


    【解决方案1】:

    每次makeCounter通过“计数器”变量调用

    这是错误的。

    你只调用了makeCounter()一次——var counter = makeCounter();
    counter是对返回函数的引用,它在i 变量。

    调用counter() 将执行这个返回的函数,就像任何其他函数一样。

    如果您多次写入makeCounter()(),您所期望的行为将会发生。

    【讨论】:

    • 我明白了,所以从 makeCounter 返回的函数是唯一执行的部分,而不是 i=0 的声明。如果返回的函数如下.. return function() { i = 0;控制台.log(++i); };那么 'i' 将永远等于 1,对吗?
    • @BenMillane,是的。如果您想确切了解在执行counter() 时调用了什么,为什么不console.log(counter)
    【解决方案2】:

    每次调用 makeCounter […] i 应重置为 0

    没错。

    makeCounter 通过counter 变量调用

    不,不是。 makeCounter 返回的匿名函数用counter() 调用。 makeCounter 只被调用一次,它的 result 被分配给了 counter 变量。

    请注意,countercounter2 都有自己的作用域 i

    的确如此,是的。但是您的示例不完整:

    var counter = makeCounter();
    counter(); // logs 1
    var counter2 = makeCounter();
    counter2(); // logs 1 again!
    counter(); // still logs 2
    counter2(); // logs 2
    

    【讨论】:

    • 对,对不起,示例不完整,我只复制了我关注的部分。该示例的其余部分与您所展示的类似。我现在明白了,我没有适当注意从 makeCounter 变量返回的内容以及如何访问它。这就是 4 天休假编码对您的影响!
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多