Явная область видимости переменной внутри функции - PullRequest
0 голосов
/ 13 сентября 2011

Я читаю эту статью и есть абзац:

Если вам когда-нибудь понадобится явно указать переменную внутри функции вы можете использовать анонимную функцию для этого. Вы может на самом деле создать анонимную функцию, а затем выполнить ее прямо и все переменные внутри будут видны анонимным Функция:

 (function() {
        var myProperty = "hello world";
        alert(myProperty);
  })();
 alert(typeof(myProperty)); // undefined

Я уже встречался с этим, но все еще нуждаюсь в некотором пояснении, почему я должен явно указывать переменную внутри функции, когда переменные неявно ограничены внутри функции в Javascript.

Не могли бы вы объяснить цель этого?

спасибо

1 Ответ

3 голосов
/ 13 сентября 2011
for (var i = 0; i < 10; i++) {
  setTimeout(function() { console.log(i) }, 10);
}

// alerts 10, 10 times

for (var i = 0; i < 10; i++) {
  (function(i) {
    // explicitly scope i
    setTimout(function() { console.log(i) }, 10);
  })(i);
}

При создании функций внутри других функций и доступе к переменным вверх по цепочке областей действия через область замыкания может быть полезно «явно ограничить область действия» переменной внутри внешней функции.

Хотя это анти паттерн. Правильное решение будет

var generateLogger = function(i) {
  return function() { console.log(i); };
}

for (var i = 0; i < 10; i++) {
  setTimeout(generateLogger(i), 10);
}

Поскольку генерация функций в цикле неэффективна и плохая практика.

Нет реальных случаев использования «явных областей видимости» переменных, которых нельзя избежать, не создавая функции внутри других функций.

...