2016-11-28 8 views
4

は私が...しかし、私は常に...javascriptの変数に関数を割り当てる?

window.localStorage.setItem('something', value); 

やっていたことがわかった。.. ...

var setFoo = function (value1) { 
    window.localStorage.setItem('foo1', value1); 
} 

var setFoo2 = function (value2) { 
    window.localStorage.setItem('foo2', value2); 
} 

を、次のようなものを持っていたので、私はそれを回すことにしました関数に...

function genericSetFoo(name, value) { 
    window.localStorage.setItem(name, value); 
} 

...、代わりに以下のいる...

var setFoo = genericSetFoo('foo1', value1); 
var setFoo2 = genericSetFoo('foo2', value2); 

は...しかし、今私はsetFoo1(value1)またはsetFoo2(value2)、アプリケーションがvalue1value2undefinedであることを訴える呼び出すしようとします。私は間違って何をしていますか?私は...私はまだやることができ

var setFoo = function(value1) { genericSetFoo('foo1', value1) }; 
var setFoo2 = function(value2) { genericSetFoo('foo2', value2) }; 

を意味する...、それはあまりにも動作します...しかし、私はどのような場合で関数を再定義する必要がある場合、それは全体のポイントを敗北します。だから私はこれにどのように取り組んでいますか?

答えて

1

私が間違って何をやっている:this値を再バインド?

window.localStorage.setItem()を呼び出す関数を返す代わりに、window.localStorage.setItem()を呼び出しています。関数を呼び出して変数に代入するときは、関数の戻り値をに代入し、関数自体には代入しないことを覚えておいてください。あなたが例えば

、:

function a() { return 2 }; 

var two = a(); 

は..あなたは、変数two2または関数であることを期待していますか?別の例として、あなたが行う場合:

var x = document.getElementById('foo'); 

が..あなたが変数xは、DOM要素または機能を含むことを期待していますか?

だから、あなたは関数を呼び出すのではなく、機能を返却する必要があります。

function genericSetFoo(name) { 
    return function (value) { 
     window.localStorage.setItem(name, value); 
    } 
} 

をだから今、あなたが行うことができます:私が間違っているのは何

var setFoo1 = genericSetFoo('foo1'); 
+0

ありがとうございます。それは本当に面白いです。これは私の現在の理解にとって最も理解しやすい解決策のようです。しかし、他のユーザーの中には、「カリング」や「部分的なアプリケーション」について何か言及してきましたが、これに比べて何についてお話しますか?感謝。 – Grateful

+0

さて、私はあなたの方法が、実際にはカレー加工の例であることに気がつきました。しかし、これは '.bind'テクニックからどのように延期されますか? – Grateful

+0

@Grateful:これは、ES5の '.bind()'のような)追加の言語機能を必要とせず、元のNetscapeリリースのjavascriptとIEのオリジナルリリースのjscriptに戻って動作します。また、関数とクロージャの仕組みを理解すれば、 '.bind()'のような追加の言語機能を実装することができます。 – slebetman

2

この場合、.bind()を使用できます。この技術は、「部分的機能評価」として知られている:

var setFoo = genericSetFoo.bind(null, 'foo1'); 
var setFoo2 = genericSetFoo.bind(null, 'foo2'); 

setFoo(value1); 

あなたがlodashを使用してまたはアンダーしている場合、あなたはそれがその最初の引数を必要としないし、しないんように.bind異なる_.partial()を使用することができます

var setFoo = _.partial(genericSetFoo, 'foo1'); 
var setFoo2 = _.partial(genericSetFoo, 'foo2'); 
1

var setFoo = genericSetFoo('foo1', value1); 

あなたがgenericSetFoo()を起動し、setFooにそこから返された値を代入している:あなたはない

。しかし、を初期化するときにがundefinedであるため(genericSetFoo()を呼び出す)、window.localStorage.setItem(name, value)valueパラメータに渡された引数を使用しようとすると、undefinedエラーが発生します。

関連する問題