很难理解javascript示例

时间:2016-08-30 14:08:19

标签: javascript

我目前正在关注javascript课程,并且正在解决其中一个示例中javascript中幕后发生的事情的问题(请参阅下面的代码)。

我理解大部分代码并理解输出记录的原因 - > [false,true,true]。然而,有一部分让我疯了(我在底部的代码中指出了一个箭头):

我的困惑围绕参数1

参数1checkPastLimitSimplified(1) var arr5 = mapForEach(arr1, checkPastLimitSimplified(1));传递的那一刻开始的旅程。

我理解当调用checkPastLimitSimplified(1)时,会为此函数创建一个执行上下文,其中参数1在变量环境中。

但现在发生了什么? checkPastLimitSimplified函数内部的函数尚未执行,只是返回。返回后会是什么样子? limiter变量在什么时候接收参数1

我知道.bind(this, limiter);会创建该函数的副本。它的limiter变量在返回之前是否已经为1?

function mapForEach(arr, fn) {

  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    newArr.push(
      fn(arr[i])
    )
  };

  return newArr;
}

var arr1 = [1, 2, 3];

var checkPastLimitSimplified = function(limiter) { // < ----CONFUSED
  return function(limiter, item) {
    return item > limiter;
  }.bind(this, limiter);
};

var arr5 = mapForEach(arr1, checkPastLimitSimplified(1));
console.log(arr5);

2 个答案:

答案 0 :(得分:4)

让我们重命名变量以查看关系:

var checkPastLimitSimplified = function(outer_limiter) {
  return function(limiter, item) {
    return item > limiter;
  }.bind(this, outer_limiter); 
};

bind在返回之前将函数签名修改为function(item) 当客户端代码调用checkPastLimitSimplified(1)(item)时,限制器将替换来自绑定上下文。

答案 1 :(得分:0)

使其更容易理解的另一种方法是将内部函数放在外面:

var checkPastLimit = function(limiter, item) {
    return item > limiter;
};

var checkPastLimitSimplified = function(outer_limiter) {
    return checkPastLimit.bind(this, outer_limiter); 
};

结果将是已定义第一个参数(限制器)的第一个函数的副本。

这个新功能只需要第二个参数(项目)。

但是在这个阶段没有执行功能代码(与限制的比较)。

相关问题