Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2012, 09:25
Новичок на форуме
Отправить личное сообщение для Ssipak Посмотреть профиль Найти все сообщения от Ssipak
 
Регистрация: 17.03.2012
Сообщений: 5

Переопределение локальных переменных во вложенных функциях
Доброго времени суток!
Столкнулся проблемой, чтобы было понятнее, убрал всё лишнее.
(function() {
  var a=1;
  (function(){
    alert(a); // Ожидал получить 1, выводит "undefined"
    var a=2;
    (function(){
      alert(a); // Выведет 2.
    })();
  })();
  alert(a); // Выведет 1.
}) ();

Требуется, чтобы внутренняя переменная локальной для функии, в которой она определена.
Ожидал, что до определения внутренней переменной будет видна внешняя, но, судя по всему, если в функции определена локальная переменная в любой позиции (хоть в конце функции), то другие одноименные переменные из внешней области видимости недоступны.
Понимаю, что происходит, понимаю, как обойти, не понимаю, почему именно так. Буду признателен, если получу ссылку на статью, где упоминается этот нюанс.

Последний раз редактировалось Ssipak, 17.03.2012 в 10:28. Причина: Недостаточно подробно описана проблема
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2012, 09:49
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

(function() {
  var a=1;
  (function(){
    alert(a);
    a=2;
    (function(){
      alert(a);
    })();
  })();
}) ();
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 17.03.2012, 10:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Ssipak
Буду благодарен за разъяснение причины такого поведения скрипта.
переопределение/замещение переменной "a" внешней функции локальной переменной с таким же именем
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2012, 10:09
Новичок на форуме
Отправить личное сообщение для Ssipak Посмотреть профиль Найти все сообщения от Ssipak
 
Регистрация: 17.03.2012
Сообщений: 5

Спасибо за внимание и быстрый ответ
Скрипт работает, но не так, как требуются. Уточню в шапке требования.
Ответить с цитированием
  #5 (permalink)  
Старый 17.03.2012, 11:35
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Ssipak Посмотреть сообщение
Доброго времени суток!
Столкнулся проблемой, чтобы было понятнее, убрал всё лишнее.
(function() {
  var a=1;
  (function(){
    alert(a); // Ожидал получить 1, выводит "undefined"
    var a=2;
    (function(){
      alert(a); // Выведет 2.
    })();
  })();
  alert(a); // Выведет 1.
}) ();

Требуется, чтобы внутренняя переменная локальной для функии, в которой она определена.
Ожидал, что до определения внутренней переменной будет видна внешняя, но, судя по всему, если в функции определена локальная переменная в любой позиции (хоть в конце функции), то другие одноименные переменные из внешней области видимости недоступны.
Понимаю, что происходит, понимаю, как обойти, не понимаю, почему именно так. Буду признателен, если получу ссылку на статью, где упоминается этот нюанс.
Извините, но перекрытие глобальных переменных глобальными даже в школе проходят (Паскаль, процедуры и функции).

Раньше можно было добраться до верхней области видимости с помощью свойства __parent__, но сейчас оно удалено.Так что - никак.
Ответить с цитированием
  #6 (permalink)  
Старый 17.03.2012, 11:39
Server
Отправить личное сообщение для Rootpassword Посмотреть профиль Найти все сообщения от Rootpassword
 
Регистрация: 26.09.2011
Сообщений: 252

Ваш код выводит undefined, потому что эквивалентен следующему
(function() {
  var a=1;
  (function(){
    var a; //  оно undefined, 
    alert(a); // Ожидал получить 1, выводит "undefined"
    a=2;
   //  alert(a); // тут уже 2
    (function(){
      alert(a); // Выведет 2.
    })();
  })();
  alert(a); // Выведет 1.
}) ();

Это логично, если прочитать о том, как ищутся в js переменные в вложенных областях видимости и про объект вызова заодно

Последний раз редактировалось Rootpassword, 17.03.2012 в 11:44.
Ответить с цитированием
  #7 (permalink)  
Старый 17.03.2012, 12:44
Новичок на форуме
Отправить личное сообщение для Ssipak Посмотреть профиль Найти все сообщения от Ssipak
 
Регистрация: 17.03.2012
Сообщений: 5

Сообщение от Rootpassword Посмотреть сообщение
Ваш код выводит undefined, потому что эквивалентен следующему
(function() {
  var a=1;
  (function(){
    var a; //  оно undefined, 
    alert(a); // Ожидал получить 1, выводит "undefined"
    a=2;
   //  alert(a); // тут уже 2
    (function(){
      alert(a); // Выведет 2.
    })();
  })();
  alert(a); // Выведет 1.
}) ();

Это логично, если прочитать о том, как ищутся в js переменные в вложенных областях видимости и про объект вызова заодно
Спасибо большое за упоминание объекта вызова, по какой-то причине не знал о нём.
Ответить с цитированием
  #8 (permalink)  
Старый 17.03.2012, 12:50
Новичок на форуме
Отправить личное сообщение для Ssipak Посмотреть профиль Найти все сообщения от Ssipak
 
Регистрация: 17.03.2012
Сообщений: 5

Сообщение от melky Посмотреть сообщение
Извините, но перекрытие глобальных переменных глобальными даже в школе проходят (Паскаль, процедуры и функции).

Раньше можно было добраться до верхней области видимости с помощью свойства __parent__, но сейчас оно удалено.Так что - никак.
Вы меня тоже извините, но, судя по вашему ответу, вы не поняли темы. В любом случае, спасибо за внимание.
Ответить с цитированием
  #9 (permalink)  
Старый 17.03.2012, 12:53
Новичок на форуме
Отправить личное сообщение для Ssipak Посмотреть профиль Найти все сообщения от Ssipak
 
Регистрация: 17.03.2012
Сообщений: 5

В общем, спасибо Rootpassword, разобрался. Почитал тут и тут. Тема закрыта.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переопределение переменных в FF и IE6 onejsquestion Общие вопросы Javascript 5 27.10.2009 09:08