尝试以错误的方式关闭?

时间:2017-02-18 14:30:26

标签: javascript

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

我有以下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

1 个答案:

答案 0 :(得分:2)

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

clsFunc('div');

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

第二种方式存储在对象属性中创建的函数。该函数引用了创建它的上下文(对clsFunc的调用),即使该调用已返回,其中包含id变量。当你调用函数(getId.div())时,它会向id添加1然后输出前缀("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"

(你看到的undefined只是因为你在JavaScript控制台中运行它,它显示了调用函数的结果;因为函数没有返回任何内容,调用的结果它是undefined。)