2017-09-14 5 views
-1

関数を返す関数を作りたいと思います。Javascriptであらかじめ割り当てられた定数を持つ関数を返す

const f = (value) => { 
    return (input) => (value <= input); 
}; 

は予想:

f(3).toString(); 
// "(input) => (3 <= input);" 

eval(f(3).toString())(4); 
// true 

実際:

f(3).toString(); 
// "(input) => (value <= input);" 

eval(f(3).toString())(4); 
// Error: input is undefined 

は私が事前に割り当てられた動的な定数と関数を生成することができますか?


私はある種のコードジェネレータを作成しています。私は関数を文字列に変換し、some.jsに保存しようとします。私の目標は、 'some.js'のユーザーはfの引数について知っている必要はありません。

+4

なぜ ' toString'/'eval'?なぜf(3)(4)だけではないのですか? – melpomene

+0

@melpomene私はある種のコードジェネレーターを作っています。 'f(3)'によって返された関数コードを 'some.js'に保存しようとしています。私の目標は、 'some.js 'のユーザーは' f'の引数について、それらを使うときに知る必要がないということです。 – Gloorx

+0

文字列のリテラル部分を3にする必要があるならば、 'f'は文字列を返します。 'f =(val)=> '(input)=>(' + val + '<= input);' ' –

答えて

0

あなたはf.toString() + '(3)'保存することができます:

f = value => input => value <= input 
 

 
s = `(${f})(${3})` 
 
console.log(s) 
 
console.log(eval(s)) 
 

 
console.log(f(3)(4)) 
 
console.log(eval(s)(4))

-1

evalを使う以外にも、あなたはかなりあります。

const f = (value) => { 
    return (input) => (value <= input); 
}; 

const isGreaterThanOrEqualTo3 = f(3); 

console.log(isGreaterThanOrEqualTo3(4)); // logs out true 
console.log(isGreaterThanOrEqualTo3(2)); // logs out false 
0

「定数の事前割当」のプロセスはpartial applicationと呼ばれます。

は、あなた自身があなたがまたlodash's partialまたはpartialRight法のような便利なサードパーティのライブラリを使用することができます関数のプロトタイプメソッドbind、例えば:

const add = (x, y) => x + y 
const add3 = add.bind(null, 3) 
add3(4) // === 7 

を使用してこれを行うことができます。

上記の例が機能しなかった理由は、f(3)が関数を返すためです。 toStringを呼び出すと、その関数の本体の文字列表現が得られます。

あなたがf(3)の結果を呼び出す

は、それは文字列を evalが、 valueを定義して 3の値を持つされている閉鎖となります。文字列で evalを呼び出しているので、グローバルスコープ内で valueという名前の変数が検索されています。

私が何を言及しているのかわからない場合は、javascript closuresを読むことをお勧めします。何かがはっきりしていない場合、私は、これは正しい方向への一歩だった願っています

は、コメントを書く:)代わりf(3).toString()

関連する問題