2014-01-23 2 views
0

Установите этот флажок интерактивный Google Chrome журнала консоли:Ошибка Javascript при использовании неопределенной переменной

test_1 = 'ok' 
> "ok" 

test_2 = test_2 || 'ok' 
> ReferenceError: test_2 is not defined 

var test_3 = test_3 || 'ok' 
> undefined 

test_1 
> "ok" 

test_2 
> ReferenceError: test_2 is not defined 

test_3 
> "ok" 

Когда я называю test_1 = 'ok' я оставляю вне var конструктор, но браузер все-таки это понимает. Я предполагаю, что он заполняется var, где я пропустил, точно так же, как он заполняется точкой с запятой.

Но для test_2 = test_2 || 'ok' У меня есть ошибка. Я знаю, что test_2 не определен, но он не поддерживает мой следующий пример test_3 от работы. По какой-то причине недостающее заявление var становится проблемой.

Может кто-нибудь объяснить мне, почему интерпретатор выдает сообщение об ошибке?

+2

[JavaScript 'hoisting'] (http://stackoverflow.com/questions/15311158/javascript-hoisting) также посмотреть [JavaScript Scoping and Histing] (http://www.adequatelygood.com/JavaScript-Scoping- and-Hoisting.html) – Givi

+0

Вы можете опустить 'var', это означает, что ваша переменная является глобальной. – elclanrs

+2

Я не понимаю, почему вы это делаете. – bgusach

ответ

2

Короче говоря, подъем.

Возьмем третий пример, который "работает":

var test_3 = test_3 || 'ok' 

Что JavaScript на самом деле делает следующее:

var test_3; 

test_3 = test_3 || 'ok'; 

Теперь, когда test_3 объявляется, ссылаясь на test_3 просто возвращает undefined, а не бросая ReferenceError, так что вы по существу делаете это:

var test_3; 

test_3 = undefined || 'ok'; 

Это не относится ко второму примеру, так как test_2 не объявляется.

+3

«Это не соответствует второму примеру, поскольку« test_2 »никогда не определяется». Вы имеете в виду, что это никогда не объявлялось. –

+0

@DavidKnipe Я делаю, спасибо за исправление. – mc10

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