2016-03-19 4 views
0

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

var test = "value"; 
var a = true; 
if(a){ 
    console.log(test); 
    var test = "another"; 
    console.log(test); 
} 
console.log(test); 

Большинство было бы ожидать:

value 
another 
value 

но фактическая:

value 
another 
another 
+0

Используйте 'let' вместо' var'. Или, если вам нужно поддерживать старые браузеры (старый IE), используйте IIFE. – nnnnnn

+0

* Я посмотрел, что переменная область не изолирована. * Где вы это выглядели? –

+0

Зачем вам одно имя переменной? Просто используйте другое имя. – Thevs

ответ

0

Переменные, объявленные с var являются функцией области видимости.

Если вы хотите блокировать сферу, ES6 вводит let:

let test = "value"; 
let a = true; 
if(a) { 
    console.log(test); // ReferenceError 
    let test = "another"; 
    console.log(test); // "another" 
} 
console.log(test); // "value" 

Но let переменные еще водрузили. Поэтому, если вы ссылаетесь на iniltialization (temporal dead zone), вы получите ReferenceError вместо значения в родительской области.

+0

Хорошее спасибо, хотя из Google и Android Safari moble и сафари рабочий стол не поддерживают прямо сейчас. – InCode

+1

@InCode Тогда у вас есть только 'var', который является функцией в области. Рассмотрим обертывание блока в IIFE. – Oriol

1

Я посмотрел, что переменная сфера не изолирована

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

Я немного озадачен кажущимся увлечением начинающих программистов JS вопросами обзора и подъема. Правильный подход:

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

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

  3. Живите долгой и счастливой жизнью.

Если по какой-то причине это важно для вас, чтобы переменные области видимости блока (что-нибудь внутри {}, такие как тело оператора if или for), то да, используйте let. В реальном мире, я думаю, вы найдете такие случаи довольно небольшими, если только вы не пишете огромные функции, которые содержат десятки или сотни строк, что не является хорошей практикой для начала. В этом случае снова следуйте лучшей практике и объявите все свои переменные в верхней части блока.

Если у вас нет let и вы хотите использовать другую переменную с одинаковым именем внутри блока, то как насчет просто использования другой переменной? Например, в примере, который вы указали, внутри блока if используйте test1 вместо test. Это на самом деле то, как babel делает это под обложками.Это transpiles

function f() { var x; { let x; } } 

в

function f() { var x; { var _x; } } 
          ^^ 

Вы увидите, что он переименовал внутренний x к _x.

Ваш вопрос по существу эквивалентен удивлению, почему это болит, когда вы вставляете контакты в глаза. Вместо того, чтобы беспокоиться о том, что в ваших глазах есть какие-то разные контакты, или что такое биологический механизм возникающей боли, почему бы не прекратить вставлять штыри в глаза, чтобы начать?

Смежные вопросы