2010-12-10 6 views
0

сам себе Может кто-нибудь объяснить это (код в глобальном масштабе)Javascript назначая глобальные переменные

var a = a || 4 // a exists & is 4 
window.a = window.a || 4 // a exists & is 4 
window.a = a || 4 // a is undefined error 
a = a || 4 // a is undefined error 

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

[Изменить] этот конкретный пример был протестирован на консоли Chrome V8.

ответ

4
var a = a || 4 // var a is evaluated at compile time, so a is undefined here 
window.a = window.a || 4 // window.a is simply undefined 
window.a = a || 4 // no var a, therefore the variable doesn't exist, = reference error 
a = a || 4 // again, no var, reference error 

var оператор объявляет переменную/функцию в ближайшем инкапсулирующем объеме и устанавливает его в undefined. Когда нет var, нет никакой переменной/функции, объявленной вообще. Поэтому эталонная ошибка.

Некоторые примеры.

function заявление:

foo(); // works 
function foo() {} 

bar(); // TypeError: undefined is not a function 
var bar = function(){}; 

var заявление:

function test(foo) {   
    if (foo) { 
     var bar = 0; // defined at compile time in the scope of function test 
    } else { 
     bar = 4; // sets the bar above, not the global bar 
    } 
    return bar; 
} 

console.log(test(false)); // 4 
console.log(bar); // ReferenceError 
+0

Конечно разница здесь неопределенное свойство для объекта и необъявленной объекта. Почему undefined во время компиляции, но не объявлено во время выполнения? – Raynos 2010-12-10 14:46:22

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