我正在编写解释函数式编程的教程。他让我提出一个解决方案并且它有效,但他的解决方案使用函数的.bind方法。
我们的解决方案除了语法之外有区别吗?
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,4,5];
var checkPassedLimitWithBind = function(limiter){
return function (limiter, item) {
return item >= limiter;
}.bind(this, limiter);
};
var checkPassedLimitWithClosure = function(limiter){
return function (item) {
return item >= limiter;
};
};
var notPassed3 = mapForEach(arr1, checkPassedLimitWithBind(3));
var doesNotPass3 = mapForEach(arr1, checkPassedLimitWithClosure(3));
alert(notPassed3);
alert(doesNotPass3);
这里的例子也可以在这里找到: https://jsfiddle.net/podbarron/73m86cj3/
答案 0 :(得分:1)
绝对没有行为差异,因为该功能不使用this
。
否则会有所不同,是的:
var checkPassedLimitWithBind = function(limiter) {
return function (limiter, item) {
return this == item;
}.bind(this, limiter);
};
var checkPassedLimitWithClosure = function(limiter) {
return function (item) {
return this == item;
};
};
console.log( checkPassedLimitWithBind.call(123)(123) ); // true
console.log( checkPassedLimitWithClosure.call(123)(123) ); // false
答案 1 :(得分:1)
bind
解决方案不必要地复杂化。因为函数可以直接访问它,所以不需要在那里部分应用limiter
值。
两者最终都会以同样的方式运作。但是,如果变量被重新分配(你永远不想用函数参数做),它可能会有所不同。
var checkPassedLimitWithBind = function(limiter){
var fn = function (limiter, item) {
return item >= limiter;
//limiter === argument value for limiter parameter
}.bind(this, limiter);
limiter = 5;
return fn;
};
var checkPassedLimitWithClosure = function(limiter){
var fn = function (item) {
return item >= limiter;
//limiter === 5 all the time
};
limiter = 5;
return fn;
};
回答帖子标题:基本上,闭包可以访问引用所持有的任何值。绑定函数时,您将获得传递的特定值。