Переопределение переменной javascript - PullRequest
40 голосов
/ 31 июля 2011

В этом учебнике написано:

If you redeclare a JavaScript variable, it will not lose its value.

Почему я должен повторно объявить переменную? Это практично в некоторых ситуациях?

спасибо

Ответы [ 6 ]

51 голосов
/ 31 июля 2011

Это не более чем напоминание, что если вы сделаете это:

var x=5;
var x;
alert(x);

Результат будет 5.

Если вы повторно объявите переменную в каком-то другомязыки, например - результат будет неопределенным, или NaN, но не в javascript.

38 голосов
/ 15 октября 2012

Пример повторного выделения переменной можно найти в Google Analytics . Когда код отслеживания JavaScript инициируется скриптом Google Analytics, он объявляет или повторно объявляет _gaq следующим образом:

var _gaq = _gaq || [];

Другими словами, если _gaq уже определено, _gaq переименовывается как само по себе. Если он не определен, он будет впервые объявлен как пустой массив.

Это позволяет коду отслеживания Google Analytics поддерживать другие сценарии, которым может потребоваться использовать переменную до инициализации кода Google Analytics. Как отметил @xralf, JavaScript допускает это.

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

Путем условного повторного выделения переменной, как это делает код отслеживания Google Analytics, она позволяет безопасно генерировать переменную из нескольких мест.

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

19 голосов
/ 31 июля 2011

Почему я должен повторно объявить переменную?

Вы не должны.Это делает для запутанного кода.

Это практично в некоторых ситуациях?

Нет.

7 голосов
/ 27 июля 2012

В javascript отсутствует область видимости блока, поэтому рекомендуется переопределить переменную для пояснения; это делает для лучшего кода.

Например:

for (var x=0; x< 100; x++) { }

alert(x); //In most languages, x would be out of scope here.
          //In javascript, x is still in scope.


//redeclaring a variable helps with clarification: 
var x = "hello";
alert(x);
3 голосов
/ 15 марта 2017

Не теряет своей стоимости из-за Подъем

var x = 5;
var x;

// this is same as

var x; // undefined;
x = 5;

Поэтому, когда вы говорите: «Если вы переопределите переменную JavaScript, она не потеряет своего значения».

В соответствии с подъемом, все декларации перемещаются наверх. А затем переменная присваивается.

var x = 25;
var x; // redeclare first time
var x; // redeclare second time

// is same as 

var x; // undefined
var x; // Not sure if this happens, but doesn't make a difference, it's still undefined
x = 25;

Что касается практичности, это иногда случается. Посмотрите на ответ @steveoliver.

0 голосов
/ 15 октября 2012

В целом, можно считать плохим стилем иметь var присваивания после других операторов из-за проблемы подъема ( см. Здесь ). При использовании «Single var pattern» ( см. Здесь ) переопределения могут происходить только так, как в примере Google Analtyics Стива Оливера. Я бы изменил приведенный выше пример на:

var x, max = 100; // no further var declarations afterwards!

for (x = 0; x < max; x++) { }

alert(x);

// redeclaration 'var x = "hello"' doesn't make any sense here
// and would be complained about by JSLint/-Hint 
x = 'hello';
alert(x);

Повторная декларация может иметь смысл, однако, при использовании значений по умолчанию для необязательных параметров (я полагаю, что это пример Google Analytics):

function abc(param1) {
  var param1 = param1 || 'default value';
}
...