Что и сколько раз алёртнется?
21 декабря 2010
var foo = 'bar'; (function func(){ alert(foo); var foo = 'baz'; alert(foo); })() alert(foo);
21 декабря 2010
var foo = 'bar'; (function func(){ alert(foo); var foo = 'baz'; alert(foo); })() alert(foo);
© 2005—2025, Александр Макаров (Sam Dark)
~ дизайн: fazeful design //Отработало за 0.01520 с. Скушано памяти: 0.86MB
Комментарии RSS по email OK
Undefined, baz, bar Переменная foo не глобальная (указание через var) по этому при первом алерте ее нету. ;)
Три алерта: «undefined», «baz», «bar» ) Внутри замыкания своя область видимости, отличный вопрос для собеседования кстати — в мемориз.
undefined baz bar
так?
Сначала произойдет вызов анонимной функции. В ней нет доступа к переменной foo, поэтому она снова создастся. Функция выведет 2 алерта: undefined и baz. И потом алерт вне функции bar. Итого три раза: 'undefined', 'baz', 'bar'
Первый раз undefined не потому что своя область видимости, а потому что именно 'var foo' объявлена переменная, а интерпретатор по всей видимости сначала ищет все объявления 'var переменная' и делает их локальными, не смотря на то что переменная используется до этого объявления и могла бы быть глобальной до объявления 'var переменная'.
тут не все так просто, как кажется что алертнется тут?
в итоге в замыкании есть доступ к переменной foo, если она не переопределяется в его неймспейсе
@Tokolist и чем ваше «определение» локальности отличается от моей области видимости? ) var определяет переменную внутри области видимости, в данном случае внутри сначала в глобальной, потом внутри замыкания.
@Чистяков Денис возможно вас неправильно понял, но в моем понимании область видимости это деление на локальные и глобальные переменные, а своя область видимости это понятие несколько шире чем локальная переменная)
Видимо, один я идиот и сразу в firebug засунул ;)
Ты не один))
В книге Девида Фленагана в главе 4.3.1 'Отсутствие блочной области видимости' это описывается так - все переменные, объявленные внутри функции, независимо от того, где именно это сделано, определены во всей функции.
@Tokolist ну, да как-то так, просто я всегда думал, что локальная переменная это переменная доступная только внутри области видимости внутри которой она находится, в данном случае — анонимной функции. @Владимир, я думаю так сделали все, но тут скорее главный вопрос, но «что» а «почему» ;) Как интересное продолжение, вариации на тему:
foo = 'bar'; (function func(){ alert(foo); var foo = 'baz'; alert(foo); })() alert(foo);
иvar foo = 'bar'; (function func(){ alert(foo); var foo = 'baz'; alert(foo); })(foo) alert(foo);
и уже упомянутый г-ном kulikov`ымУпсс, вставилось не так как хотел (
и
Элементарно: baz baz bar
Объясню почему. В яваскрипт очень интересно устроена область видимости переменных. Даже если переменная объявлена в конце функции, то в начале функции она все равно доступна. И того имеем baz baz для функции и потом отдельно bar
Хм, странно, по теории должно быть baz baz bar, а на практике undefined baz bar....
А, все, въехал, чуть-чуть подзабыл про область видимости, как я уже писал выше про область видимости: Даже если переменная объявлена в конце функции, то в начале функции она все равно доступна. А так как значение переменной foo еще не присвоено, то и выходит undefined baz bar
@Ekstazi
Хм, интересно, откуда вы взяли эту мысль?
А вы почитайте документацию по javascript про области видимости. В вашем примере вы объявляете свойство test у объекта window. На javascript.ru об этом были хорошо написано.
не знал, спасибо! Хорошо, что для меня этот нюанс, не стал причиной сложного дебага ;)
@Ekstazi даже если написать var foo (локальная переменная), а не [window.]foo ("глобальная" переменная) она не станет доступна до её объявления в функции, как следует из вашей фразы.
Так стоп, может не так выразился. В неймспейсе имя это переменой будет существовать, но значение у неё будет undefined до тех пор пока явного присвоения не будет. По крайней мере так в стандарте яваскрипт прописано