我正在从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是限制器
答案 0 :(得分:2)
call
和apply
(或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