Есть ли какая-либо причина для преднамеренного введения замыканий для предотвращения подъема переменных? - PullRequest
3 голосов
/ 11 февраля 2011

Рассмотрим этот код:

for (var j = 0; j < 10; j++){
    // ...
}

Предположим, что цикл for появляется сразу после этого, который использует ту же переменную j counter. Netbeans жалуется, что второй j переопределяет первый из-за переменной подъема.

Есть ли причина, почему или почему бы мне не окружить свой цикл замыканием:

(function(){
    for (var j = 0; j < 10; j++){
        // ...
    }
})();

... чтобы предотвратить переменное поведение подъема и остановить жалобы Netbean?

Ответы [ 5 ]

4 голосов
/ 11 февраля 2011

Переменные Javascript имеют область действия функции , а не область действия блока , к которой вы, вероятно, привыкли. (Это большая бородавка Javascript, к которой мы должны привыкнуть)

Обычные правила стиля предполагают, что лучше объявить все переменные, включая переменные цикла только один раз в начале функции. (Не объявляйте их внутри оператора for - это имеет смысл на других языках, но не в Javascript).

Надеюсь, это заставит ваш компилятор успокоиться.

(Вам не нужно слишком много беспокоиться об обоих циклах, использующих одну и ту же переменную - переменная в любом случае повторно инициализируется)

2 голосов
/ 11 февраля 2011

Вы жалуетесь, потому что вы переделываете var? Вы можете удалить второй var, так как он уже будет в области видимости.

1 голос
/ 11 февраля 2011

Проблема в том, что переменные JavaScript не block scoped, а function scoped

Предположим, у вас есть такой фрагмент

function MyDemo(){
    var i = 0;
    for( var j = 0; j < 10; j++ ){
        ++i;
    }
    alert( i );
    alert( j );
}

В javascript j будет предупрежден как 10, в то время как как в языке с блочной областью, например C # или Java, это будет что-то вроде j, не определенное в контексте

В этом и заключается проблема, а не в том, чтобы обернуть ее в замыкание.

Почему бы вам не использовать другую переменную или повторно инициализировать эту переменную, не объявляя ее снова?

Полезная ссылка: Объяснение области применения и замыканий JavaScript

0 голосов
/ 11 февраля 2011

99% времени, снижение производительности во время выполнения дополнительного вызова функции не будет иметь значения. Что более важно, так это дополнительный код, загромождающий вашу кодовую базу и усложняющий чтение. Я бы сказал, не заключайте это в вызов функции только ради вашей IDE.

0 голосов
/ 11 февраля 2011

Заключение цикла в замыкание кажется мне ненужным и может вызвать проблемы, если вы определяете переменные внутри цикла for, которые вы хотели бы использовать вне цикла.Например:

(function() {
  for (var j = 0; j < 10; j++) {
    var foo = "bar"
  }
});

// foo is undefined here

Принимая во внимание:

for (var j = 0; j < 10; j++) {
  var foo = "bar"
}

// foo is defined here

С точки зрения микро-производительности замыкание также создает ненужные издержки, поскольку, как говорили другие люди, если вы берете var от второго for цикла, он должен перестать жаловаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...