【问题标题】:Trying a closure the wrong way?以错误的方式尝试关闭?
【发布时间】:2017-02-18 14:30:25
【问题描述】:

我无法弄清楚以下代码有什么问题,以及为什么在我使用第二种方式时它会起作用。谁能帮我理解一下?

我有以下 Javascript 代码:

var clsFunc = function(prefix) {
  var id = 0;
  return function() {
    id = id + 1;
    console.log(prefix + id);
  }
}

第一种方法(无效):

如果我尝试像这样调用这个函数,什么都不会发生

clsFunc('div') 

第二种方式(有效)

var getId = {'div': clsFunc('div')}

getId.div()

结果:

div1
undefined
getId.div()

结果:

div2

【问题讨论】:

标签: javascript


【解决方案1】:

clsFunc 函数创建一个函数并返回它。所以只是做

clsFunc('div');

...毫无意义,因为它创建了一个函数然后将其丢弃,因为您没有将它存储在任何地方。

第二种方式将创建的函数存储在对象属性中。该函数引用了创建它的上下文(对clsFunc 的调用),即使该调用已返回,其中包含id 变量。当您调用函数 (getId.div()) 时,它会将 1 添加到 id,然后输出前缀 ("div"),如果 id 后跟新值(1,然后 2,然后,3,等等) .

第二种方式不需要对象,只需使用变量即可:

var clsFunc = function(prefix) {
  var id = 0;
  return function() {
    id = id + 1;
    console.log(prefix + id);
  }
};

var f = clsFunc('div');
f(); // "div1"
f(); // "div2"

(您看到的undefineds 只是因为您在 JavaScript 控制台中运行它,它会显示调用该函数的结果;由于该函数不返回任何内容,因此调用它的结果是undefined.)

【讨论】:

  • 非常感谢您的快速帮助。感谢您的帮助。
  • 我猜是从同时删除他们答案的人那里报复 DV。
  • 也很高兴从声誉超过 515k 的人那里得到答案。
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2015-09-08
  • 2012-06-18
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多