2016-08-30 41 views
6

我目前正在关注一个JavaScript课程,并且有一些问题了解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); 

回答

4

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

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

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

+0

因此,如果我正确理解这一点,那么通过调用'checkPastLimitSimplified(1)'传递给函数的参数'outer_limiter'在函数返回之前是否可用并在.bind中解析? (1,item){ return item>限制器; }'返回?所以'返回'不会停止.bind()在这一点执行? – Yapartase

+0

当然,'return'涉及整个'function(){}。bind()'表达式。 –

0

另一种方式来使其更容易理解在外面把内部功能:

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

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

结果将是第一个功能的使用已定义的第一个参数(限)的副本。

这个新函数将只需要第二个参数(item)。

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