2017-01-02 9 views
1

Я работаю над учебником, объясняющим функциональное программирование. Он попросил меня прийти с решением, и это сработало, но его решение использует метод функции .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

'.bind()' не имеет ничего общего с функциональным программированием (хотя функциональное программирование позволяет реализовать '.bind()' самостоятельно, не требуя изменений в языке). '.bind()' относится к объектно-ориентированному программированию, замыкания связаны с функциональным программированием. Они делают две совершенно не связанные вещи. – slebetman

+0

Спасибо за это. – pk36

ответ

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

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

Ответ на сообщение: В принципе, закрытие будет иметь доступ к любому значению, которое имеет эта ссылка. Когда вы привязываете функцию, вы получите это конкретное значение.