Рассмотрим следующую проблему: я хочу создать массив функций, каждая функция просто печатает свой индекс в этом массиве. В Python, это можно легко сделать сПараметры по умолчанию и currying: Python vs. Javascript
funcs = []
for i in range(5):
funcs.append(lambda i=i: print(i))
funcs[2]()
# 2
Здесь используются значения по умолчанию аргумент, как способ сделать выделки (если я понимаю этот термин справа).
До ES6 в Javascript не было значений аргументов по умолчанию, поэтому каррирование должно выполняться по-разному. Теперь у нас есть они, и я попытался перевести Python на Javascript буквально:
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 для передачи значений по умолчанию?
(Хорошо, я знаю, что я могу использовать let
здесь вместо var
, я просто изучать Javascript после нескольких лет с Python и пытаюсь понять это underhoods.)
Просто используйте другое имя переменной, 'j = i' then' console.log (j) ' – elclanrs
Это не имеет никакого отношения к currying. Это связано с поздним связыванием замыканий в Python. На самом деле это хак, который использует тот факт, что аргументы по умолчанию в Python устанавливаются во время определения функции, позволяя имитировать раннее связывание. Вероятно, есть различия с Javascript (который, я считаю, также имеет поздние связывание). –
@elclanrs, изменяющий имя переменной, просто предоставляет другую проблему, которая является замыканием, созданным циклом for, в котором 'funcs [n]' всегда будет возвращать максимальное значение 'i'. Это то, о чем говорил juanpa.arrivillaga с поздним симуляционным ранним связыванием в закрытии. – mhodges