Javascript 函数式编程:What';使用闭包和使用bind方法的区别是什么?

Javascript 函数式编程:What';使用闭包和使用bind方法的区别是什么?,javascript,functional-programming,closures,bind,Javascript,Functional Programming,Closures,Bind,我正在编写一个解释函数式编程的教程。他要求我提供一个解决方案,结果成功了,但他的解决方案使用了函数的.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];

我正在编写一个解释函数式编程的教程。他要求我提供一个解决方案,结果成功了,但他的解决方案使用了函数的.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);
函数映射foreach(arr,fn){
var newArr=[];
对于(变量i=0;i=限制器;
}.绑定(此,限制器);
};
var CheckPassedLimitWithClose=功能(限制器){
返回函数(项目){
返回项>=限制器;
};
};
var notPassed3=mapForEach(arr1,checkPassedLimitWithBind(3));
var doesNotPass3=mapForEach(arr1,checkPassedLimitWithClosure(3));
警报(未通过3);
警报(doesNotPass3);
示例也可在此处找到:
绝对没有行为差异,因为该函数不使用此

否则就不同了,是的:

var checkPassedLimitWithBind=函数(限制器){
返回功能(限制器,项目){
返回此==项;
}.绑定(此,限制器);
};
var CheckPassedLimitWithClose=功能(限制器){
返回函数(项目){
返回此==项;
};
};
console.log(checkPassedLimitWithBind.call(123)(123));//真的

console.log(checkPassedLimitWithClosure.call(123)(123));//false
绑定
解决方案不必要地复杂。无需在此处部分应用
限制器
值,因为函数几乎可以直接访问它

两者最终将以同样的方式工作。但是,如果变量被重新赋值,情况可能会有所不同(您永远不希望使用函数参数)

回答文章标题:基本上,闭包将访问引用所持有的任何值。当您绑定函数时,您将获得传递的特定值。

.bind()
与函数式编程无关(尽管函数式编程允许您自己实现
.bind()
,而无需更改语言)
.bind()
与面向对象编程相关,闭包与函数编程相关。他们做两件完全无关的事。
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;
};