Единственное отличие, о котором стоит беспокоиться, - это удобство сопровождения кода. Как правило, переменные должны находиться в наименьшей возможной области видимости . Это может облегчить чтение кода. Например:
Они не являются функционально идентичными, если анонимная функция вызывается несколько раз, но в качестве аргумента допустим, что она будет вызываться только один раз.
Если бы вы не явно сказали, что , читатель кода, вероятно, подумает, что, по крайней мере, существует возможность вызова fn
более одного раза (в противном случае, в чем смысл внешней переменной области видимости?).
Или представьте, что в функции было больше кода: сравните
function fn () {
// a moderate amount of code
return something(cb => {
// a moderate amount of code
let i = 0
setInterval(() => cb(i++), 1000)
})
}
с
function fn () {
let i = 0
// a moderate amount of code
return something(cb => {
// a moderate amount of code
setInterval(() => cb(i++), 1000)
})
}
Первая версия, вероятно, предпочтительнее, поскольку объявление переменнойочень близко к месту его использования, что не относится ко второй версии.
Другое различие между ними состоит в том, что чем дальше цепочка областей видимости интерпретатор должен искать, чтобы найти ссылку на переменную, темЭто займет больше времени, по крайней мере, при некоторых обстоятельствах. Это совершенно несущественно почти во всех случаях, но все же есть потенциальная разница: сравните https://jsfiddle.net/pa2v9xuj/ с https://jsfiddle.net/wzo7bgve/