Предпочитайте переменные внутри или снаружи анонимной функции - PullRequest
0 голосов
/ 22 октября 2019

Допустим, у меня есть анонимная функция, которой нужно несколько переменных, чтобы отслеживать ее состояние. Функция работает одинаково с переменными внутри или снаружи анонимной функции. Существуют ли какие-либо соображения относительно производительности или другие соображения при принятии решения о том, где определять переменные?

Например. Есть ли причина предпочитать это

function fn () {
  let i = 0
  return something(cb => {
    setInterval(() => cb(i++), 1000)
  })
}

этому

function fn () {
  return something(cb => {
    let i = 0
    setInterval(() => cb(i++), 1000)
  })
}

Они не являются функционально идентичными, если анонимная функция вызывается несколько раз, но для аргументации, скажем такбудет вызван только один раз.

1 Ответ

0 голосов
/ 22 октября 2019

Единственное отличие, о котором стоит беспокоиться, - это удобство сопровождения кода. Как правило, переменные должны находиться в наименьшей возможной области видимости . Это может облегчить чтение кода. Например:

Они не являются функционально идентичными, если анонимная функция вызывается несколько раз, но в качестве аргумента допустим, что она будет вызываться только один раз.

Если бы вы не явно сказали, что , читатель кода, вероятно, подумает, что, по крайней мере, существует возможность вызова 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/

...