<rmcreative>

RSS

Что и сколько раз алёртнется?

21 декабря 2010

var foo = 'bar';
(function func(){
  alert(foo);
  var foo = 'baz';
  alert(foo);
})()
alert(foo);

Комментарии RSS

  1. №3588
    Юрий
    Юрий 21 дек. 2010 г., 23:53:23

    Undefined, baz, bar Переменная foo не глобальная (указание через var) по этому при первом алерте ее нету. ;)

  2. №3589
    Чистяков Денис
    Чистяков Денис 21 дек. 2010 г., 23:54:23

    Три алерта: «undefined», «baz», «bar» ) Внутри замыкания своя область видимости, отличный вопрос для собеседования кстати — в мемориз.

  3. №3590
    Евгений
    Евгений 21 дек. 2010 г., 23:54:25

    undefined baz bar

    так?

  4. №3591
    BerdArt
    BerdArt 21 дек. 2010 г., 23:54:43

    Сначала произойдет вызов анонимной функции. В ней нет доступа к переменной foo, поэтому она снова создастся. Функция выведет 2 алерта: undefined и baz. И потом алерт вне функции bar. Итого три раза: 'undefined', 'baz', 'bar'

  5. №3592
    Tokolist
    Tokolist 22 дек. 2010 г., 0:03:51

    Первый раз undefined не потому что своя область видимости, а потому что именно 'var foo' объявлена переменная, а интерпретатор по всей видимости сначала ищет все объявления 'var переменная' и делает их локальными, не смотря на то что переменная используется до этого объявления и могла бы быть глобальной до объявления 'var переменная'.

  6. №3593
    kulikov
    kulikov 22 дек. 2010 г., 0:14:32

    тут не все так просто, как кажется что алертнется тут?

    var foo = 'bar';
    (function func(){
      alert(foo);
    })()
    alert(foo);

    в итоге в замыкании есть доступ к переменной foo, если она не переопределяется в его неймспейсе

  7. №3594
    Чистяков Денис
    Чистяков Денис 22 дек. 2010 г., 0:15:54

    @Tokolist и чем ваше «определение» локальности отличается от моей области видимости? ) var определяет переменную внутри области видимости, в данном случае внутри сначала в глобальной, потом внутри замыкания.

  8. №3595
    Tokolist
    Tokolist 22 дек. 2010 г., 0:41:10

    @Чистяков Денис возможно вас неправильно понял, но в моем понимании область видимости это деление на локальные и глобальные переменные, а своя область видимости это понятие несколько шире чем локальная переменная)

  9. №3596
    Владимир
    Владимир 22 дек. 2010 г., 0:51:53

    Видимо, один я идиот и сразу в firebug засунул ;)

  10. №3597
    Юрий
    Юрий 22 дек. 2010 г., 0:54:06

    Ты не один))

  11. №3598
    Сергей
    Сергей 22 дек. 2010 г., 5:17:55

    В книге Девида Фленагана в главе 4.3.1 'Отсутствие блочной области видимости' это описывается так - все переменные, объявленные внутри функции, независимо от того, где именно это сделано, определены во всей функции.

  12. №3599
    Чистяков Денис
    Чистяков Денис 22 дек. 2010 г., 8:08:45

    @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`ым

  13. №3600
    Чистяков Денис
    Чистяков Денис 22 дек. 2010 г., 8:13:02

    Упсс, вставилось не так как хотел (

    foo = 'bar';
    (function func(){
        alert(foo);
        var foo = 'baz';
        alert(foo);
    })()
    alert(foo);

    и

    var foo = 'bar';
    (function func(foo){
        alert(foo);
        var foo = 'baz';
        alert(foo);
    })(foo)
    alert(foo);
  14. №3601
    Ekstazi
    Ekstazi 22 дек. 2010 г., 11:23:19

    Элементарно: baz baz bar

    Объясню почему. В яваскрипт очень интересно устроена область видимости переменных. Даже если переменная объявлена в конце функции, то в начале функции она все равно доступна. И того имеем baz baz для функции и потом отдельно bar

  15. №3602
    Ekstazi
    Ekstazi 22 дек. 2010 г., 11:24:57

    Хм, странно, по теории должно быть baz baz bar, а на практике undefined baz bar....

  16. №3603
    Ekstazi
    Ekstazi 22 дек. 2010 г., 11:29:36

    А, все, въехал, чуть-чуть подзабыл про область видимости, как я уже писал выше про область видимости: Даже если переменная объявлена в конце функции, то в начале функции она все равно доступна. А так как значение переменной foo еще не присвоено, то и выходит undefined baz bar

  17. №3604
    Артём
    Артём 22 дек. 2010 г., 13:07:04

    @Ekstazi

    Даже если переменная объявлена в конце функции, то в начале функции она все равно доступна.

    Хм, интересно, откуда вы взяли эту мысль?

    (function() {
        alert(test);     
        test = '123';    
        alert(test);
    })();
  18. №3605
    Ekstazi
    Ekstazi 22 дек. 2010 г., 13:14:34

    А вы почитайте документацию по javascript про области видимости. В вашем примере вы объявляете свойство test у объекта window. На javascript.ru об этом были хорошо написано.

  19. №3606
    Ti
    Ti 22 дек. 2010 г., 13:41:14

    не знал, спасибо! Хорошо, что для меня этот нюанс, не стал причиной сложного дебага ;)

  20. №3607
    Артём
    Артём 22 дек. 2010 г., 17:16:45

    @Ekstazi даже если написать var foo (локальная переменная), а не [window.]foo ("глобальная" переменная) она не станет доступна до её объявления в функции, как следует из вашей фразы.

  21. №3609
    Ekstazi
    Ekstazi 22 дек. 2010 г., 20:37:17

    Так стоп, может не так выразился. В неймспейсе имя это переменой будет существовать, но значение у неё будет undefined до тех пор пока явного присвоения не будет. По крайней мере так в стандарте яваскрипт прописано

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.