Интерпретатор работает таким образом, что все var'ы переменных поднимает в хэд функций. Поэтому, если объявить какую либо переменную хоть в конце метода, доступ к ней есть уже в начале:
function func() { alert(initializedProperty);// скажет undefined alert(property);// скажет undefined
function func(){ alert(initializedProperty);// вывалится с ошибкой ReferenceError: initializedProperty is not defined alert(property);// сказал бы undefined
Не успел еще заглянуть в стандарт, но предположу, что undefined существует как один из типов в скопе window, что и возвращает mySuperProperty на момент if'а.
8 комментариев:
Ну если никто не знает, то могу только посоветовать почитать ECMA (пункты 10.1.3 и 10.2) :)
А вообще нафига этот "in window"? :-)
"in window" помогает понять суть данной проблемы. Вернее не проблемы, а того как работает js-core.
Под Firefox 3 и IE 7 получаю 'undefined'. Как воспроизвести проблему (поведение)? Что должно получиться?
Ну как бы вопрос и был в том, почему срабатывает if перед alert, хотя значение undefined :)
Интерпретатор работает таким образом, что все var'ы переменных поднимает в хэд функций. Поэтому, если объявить какую либо переменную хоть в конце метода, доступ к ней есть уже в начале:
function func() {
alert(initializedProperty);// скажет undefined
alert(property);// скажет undefined
// много бреда...
var initializedProperty = 1;
var property;
}
func();
Вместо подтверждения:
function func(){
alert(initializedProperty);// вывалится с ошибкой ReferenceError: initializedProperty is not defined
alert(property);// сказал бы undefined
// много бреда...
initializedProperty = 1;
var property;
}
func();
Не успел еще заглянуть в стандарт, но предположу, что undefined существует как один из типов в скопе window, что и возвращает mySuperProperty на момент if'а.
Отправить комментарий