Call()方法无法在javascript

时间:2018-12-13 11:34:32

标签: javascript

我正在从udemy学习Javascript,并且在一次讲师中,老师已经使用bind()方法实现了一个功能,但是当我尝试使用call()时,它是行不通的。

这是一个可用于绑定的小程序:

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];

/* trying to compare if the item is greater than given limiter*/
var checkPastLimit = function(limiter, item){
    return item > limiter;
}

/*bind both functions and check if item is greater than 1*/
var arr4 = mapForEach(arr1, checkPastLimit.bind(this,1));
/*print array in boolean*/
console.log(arr4); 

-----
Output: [false,true,true] 

该程序可以按我的要求工作,但是如何在这里使用call()apply()方法而不是绑定方法?我从昨天开始尝试,但是没有得到想要的东西。

我尝试过的事情

我尝试遵循mozilla's offical页上的文档,但是没有得到想要的输出。

我尝试如下编辑checkPastLimit函数:

var checkPastLimit = function(limiter, item){
    mapForEach.call(arr1, checkPastLimit(this,1));
    return item > limiter;
}

console.log(checkPastLimit);

但是此代码引发了递归问题。

我也尝试了另一种技巧,但是它也没有起作用

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

mapForEach.call(arr1, checkPastLimit(this,1)); 

我想要的

上面列出的工作程序使用bind()生成所需的输出,但是我想使用call()

获取输出

[false,true,true] //如果1是限制器

[false,false,true] //如果2是限制器

2 个答案:

答案 0 :(得分:2)

callapply(或bind)并不是同一件事的替代品。 call返回一个函数,而this执行一个函数。它们唯一的共同点是,它们允许指定this应该是什么。但是在您的实际情况下,未使用bind的值,因此公共部分不相关。

在您的工作代码中,bind方法用于即时创建 curried 函数,即,它创建了一个新函数,该函数减少了一个参数,因为第一个参数固定为值1。这称为 currying

如果您想在没有bind的情况下执行此操作,那么您实际上将实现自己的// Create this additional function, which returns a function(!) with one less argument. var curriedCheckPastLimit = function (limiter) { return function(item) { return checkPastLimit(limiter, item); } } var arr4 = mapForEach(arr1, curriedCheckPastLimit(1)); // No more bind! 版本(特定于这种情况)。例如,它可能看起来像这样:

var arr4 = mapForEach(arr1, item => checkPastLimit(1, item));

或者您也可以删除currying模式,然后执行此操作(使用带有表达式语法的箭头功能):

mapForEach

请注意:您的var arr4 = arr1.map(item => checkPastLimit(1, item)); 函数已经作为本机数组方法存在:

{{1}}

答案 1 :(得分:1)

函数mapForEach接受一个函数作为第二个参数。

调用checkPastLimit.bind(this,1)时,它将返回一个函数作为结果。

调用checkPastLimit.call(this,1)时返回false。

因此,您不能简单地使用call而不是bind

enter image description here