函数式编程:使用闭包和使用绑定方法之间的区别是什么?

时间:2017-01-02 01:28:14

标签: 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];

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/

2 个答案:

答案 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;
};

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