我目前正在关注javascript课程,并且正在解决其中一个示例中javascript中幕后发生的事情的问题(请参阅下面的代码)。
我理解大部分代码并理解输出记录的原因 - > [false,true,true]。然而,有一部分让我疯了(我在底部的代码中指出了一个箭头):
我的困惑围绕参数1
:
参数1
从checkPastLimitSimplified(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);
答案 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);
};
结果将是已定义第一个参数(限制器)的第一个函数的副本。
这个新功能只需要第二个参数(项目)。
但是在这个阶段没有执行功能代码(与限制的比较)。