Подтвердить что ты не робот

Объявление переменной Javascript дважды в той же области - это проблема?

Может возникнуть следующий код:

var a = 1;
var a = 2;

Я понимаю, что переменные javascript объявлены в начале области. Например:

var foo = 'a';
foo = 'b';
var bar = 'c';

Обработано как:

var foo;
var bar;
foo = 'a';
foo = 'b';
bar = 'c';

Поэтому мой первоначальный фрагмент кода станет следующим:

var a;
a = 1;
a = 2;

Или это станет:

var a;
var a;
a = 1;
a = 2;

Я понимаю, что объявление переменной javascript дважды в той же области не является хорошей практикой, но меня больше интересует влияние этого.

4b9b3361

Ответ 1

Как вы сказали, в два раза больше того же var, JavaScript перемещает это объявление в начало области, а затем ваш код будет выглядеть следующим образом:

var a;
a = 1;
a = 2;

Следовательно, это не дает нам никакой ошибки.

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

for (var i = 0; i < n; i++) {
    // ...
}
for (var i = 0; i < m; i++) {
    // ...
}

Вот почему гуру JavaScript, такие как Дуглас Крокфорд, предлагают программистам вручную переместить эти объявления в верхнюю часть области:

var i;    // declare here
for (i = 0; i < n; i++) {    // initialize here...
    // ...
}
for (i = 0; i < m; i++) {    // ... and here
    // ...
}

Ответ 2

Объявление той же переменной дважды так же хорошо, как объявление ее один раз. Вышеуказанный оператор не будет оказывать никакого влияния.

var a, a;

в следующем случае вы просто переопределяете переменную foo. Это будет иметь последствия, если вы определили foo в локальном и глобальном масштабе. Сначала JS будет искать foo в локальной области, а затем, если он не найдет, он будет выглядеть в глобальной области.

var foo;
var bar;
foo = 'a';
foo = 'b';
bar = 'c';

Ответ 3

Такое двойное объявление переменной не вызовет никаких проблем благодаря функции подъема переменных javascript. так что в вашей DOM, где бы вы ни объявили переменные, но присваивали (или) не присваивали, они будут помещаться вверху во время компиляции.

Example:
    var foo='hai!';
    bar='welcome!';
    var bar;

Вы можете ожидать, что приведенный выше фрагмент кода должен выдавать "неопознанную" ошибку, но все же javascript управляет ею, помещая объявление переменной bar вверху. Таким образом, даже до объявления переменной ее значение может быть присвоено в отличие от других языков.

Надеюсь, это поможет вам в некоторой степени

Ответ 4

Как насчет сценария, когда функции передается значение параметра, а имя параметра, например, URL. Затем мы идем и объявляем переменную, называющую ее url в определении функции.

например

function (url) {
    var url = typeof(url) === 'string' ? url : 'http://blah/default.html';

    return url;
}