次の問題を考えてみましょう。各関数は配列のインデックスを出力するだけで、関数の配列を作成します。 Pythonでは、それはここでは(私は右の用語を理解していれば)、カリー化を行うための方法として、デフォルト引数値を使用しデフォルトのパラメータとカリング:Python対Javascript
funcs = []
for i in range(5):
funcs.append(lambda i=i: print(i))
funcs[2]()
# 2
で簡単に行うことができます。
ES6以前では、Javascriptにデフォルトの引数値がなかったため、カリングは別の方法で行われなければなりませんでした。今、私たちはそれらを持っていると私は文字通りJavaScriptにはPythonを翻訳してみました:
funcs = []
for (var i=0; i<5; i++) {
funcs.push(function (i=i) {console.log(i)})
}
# this part pass OK
funcs[2]()
ReferenceError: i is not defined
at Array.<anonymous> (evalmachine.<anonymous>:3:27)
at evalmachine.<anonymous>:1:9
at ContextifyScript.Script.runInThisContext (vm.js:26:33)
at Object.exports.runInThisContext (vm.js:79:17)
at run ([eval]:608:19)
at onRunRequest ([eval]:379:22)
at onMessage ([eval]:347:17)
at emitTwo (events.js:106:13)
at process.emit (events.js:191:7)
at process.nextTick (internal/child_process.js:752:12)
それが失敗したのはなぜ?デフォルト値を渡すPythonとJavascriptの違いは何ですか?
(さて、私は私が代わりにvar
の、私はただのPythonと、数年後にJavascriptを勉強し、それがunderhoods理解しようとしているここlet
を使用することができることを知っている。)
'j = i'、' console.log(j) ' – elclanrs
という別の変数名を使うだけです。これはカリングとは関係ありません。これは、Pythonでのクロージャの遅延バインディングと関係があります。実際には、Pythonのデフォルト引数が関数定義時にセットされ、初期バインディングをシミュレートできるという事実を利用するハックです。おそらく、Javascriptとの違いがあります(私はこれもlate-binding closureを持っていると信じています)。 –
@elclanrsは変数名を変更するだけで、forループによって作成されるクロージャで、 'funcs [n]'は常に 'i'の最大値を返します。これは、juanpa.arrivillagaが、後期とシミュレートされた早期の結束で結びついていたものです。 – mhodges