2017-01-02 8 views
1

私は関数型プログラミングを説明するチュートリアルに取り組んでいます。彼は私に解決策を提示するように頼んだが、うまくいきましたが、彼のソリューションは関数の.bindメソッドを使用しています。Functional Programming:クロージャの使用とバインド方法の違いは何ですか?

構文以外の解決策に違いはありますか?

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

例もここで見つけることができます。その関数はthisを使用しないため https://jsfiddle.net/podbarron/73m86cj3/

+0

'.bind()'は関数型プログラミングとは関係ありませんが(関数型プログラミングでは、言語を変更することなく '.bind()'を自分で実装できます)。 '.bind()'はオブジェクト指向プログラミングに関連し、クロージャは関数型プログラミングに関連しています。彼らは全く関係のない2つのことをします。 – slebetman

+0

ありがとう。 – pk36

答えて

1

全く行動の違いはありません。

それ以外の場合は、はい、異なるだろう:

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

投稿タイトルへの回答:基本的に、クロージャーは参照が保持している値にアクセスできます。関数をバインドすると、その特定の値が渡されます。

関連する問題