闭包在javascript中返回什么?

时间:2018-02-04 18:38:21

标签: javascript function object closures

我遇到了一个非常有趣但又令人困惑的代码片段,并且很难理解它究竟是什么让它回归。

// Create a data point generator.
var getDataPoint = (function() {
  var _x = -1;
  var _max = _data.length;

  return function() {
    _x = (_x + 1) % _max;
    return {
      x: Date.now(),
      y: _data[_x]
    };
  };
})();

var heartRate = 60; // bpm
var interval = 60 * 1000 / (_data.length * heartRate);

// Generate a new data point based on the heart rate.
setInterval(function() {
  $('.jke-ecgChart').ecgChart('addDataPoint', getDataPoint());
}, interval);

现在我对闭包及其工作方式有了非常基本的了解,例如,它们是外部函数的范围。

但更令我困惑的是这条特定的路线:

$('.jke-ecgChart').ecgChart('addDataPoint', getDataPoint());

getDataPoint()将返回什么?函数或{x,y}?

如果我想返回{x,y}而不是函数怎么办?

由于

1 个答案:

答案 0 :(得分:2)

此处getDataPoint被解析为第一行中immediately invoked function返回的值。因此getDataPoint存储对line 4返回的函数的引用。因此,当你在$('.jke-ecgChart').ecgChart('addDataPoint', getDataPoint())调用它时,将调用第4行的函数,它将返回{x,y},而不是函数。您可以在下面的代码中看到类似的示例,我在其中使用了一些常量,只是为了能够记录输出。

// Create a data point generator.
var getDataPoint = (function() {
  var _x = -1;
  var _max = 6;

  return function() {
    _x = (_x + 1) % _max;
    return {
      x: Date.now(),
      y: _x
    };
  };
})();

var heartRate = 60; // bpm
var interval = 1000;

// Generate a new data point based on the heart rate.
setInterval(function() {
  console.log(getDataPoint());
}, interval);