Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.04.2013, 22:06
Аспирант
Отправить личное сообщение для doox911 Посмотреть профиль Найти все сообщения от doox911
 
Регистрация: 01.04.2013
Сообщений: 56

Как работает этот код
var obj={
 x:1,
 y:2,
 z:3
           };
obj.propertyIsEnumerable("toString");
for(w in obj)
 {
   console.log(w);
   alert(w);
 }


Вопрос такой.
Я ни где не объявлял переменную "w", как браузер понимает, что Я имел виду. И вообще почему он работает? (Пример взят из книги) Я не понял этот пример.
Ответить с цитированием
  #2 (permalink)  
Старый 01.04.2013, 22:13
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

"w" - просто объявляется глобальной. В for(var w in obj), соответственно, локальной.

Т.е.:
for(w in obj){}
равносильно
w = undefined;
for(w in obj){}
, а:
for(var w in obj)
соответственно:
var w;
for(w in obj){}



Это конструкция самого языка:
for (property in object) statement
for (initial-expression; condition; final-expression) statement
while (condition) statement
do statement while (condition)
__________________
29375, 35

Последний раз редактировалось Aetae, 01.04.2013 в 22:21.
Ответить с цитированием
  #3 (permalink)  
Старый 01.04.2013, 22:15
Аспирант
Отправить личное сообщение для doox911 Посмотреть профиль Найти все сообщения от doox911
 
Регистрация: 01.04.2013
Сообщений: 56

Прикол в том, что если вывести её до цикла, она хранит имя последнего свойства. Почему?
Ответить с цитированием
  #4 (permalink)  
Старый 01.04.2013, 22:21
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

doox911,
потому что объявили ее вы до цикла, в цикле вы уже к ней обращаетесь, и там соответсвенно сохраняется последнее
__________________
оляля, ололо
Ответить с цитированием
  #5 (permalink)  
Старый 01.04.2013, 22:30
Аспирант
Отправить личное сообщение для doox911 Посмотреть профиль Найти все сообщения от doox911
 
Регистрация: 01.04.2013
Сообщений: 56

Так почему соответственно последнее? И не null например?
Ответить с цитированием
  #6 (permalink)  
Старый 01.04.2013, 23:32
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

var w; // Ты объявил w

// В цикле твоя w каким-нибудь образом меняется (все это условно)
w = 5;
w = 8;
w = 10;
w = 2;

alert(w); // И с чего бы w должнa быть null?
__________________
оляля, ололо
Ответить с цитированием
  #7 (permalink)  
Старый 01.04.2013, 23:55
Аспирант
Отправить личное сообщение для doox911 Посмотреть профиль Найти все сообщения от doox911
 
Регистрация: 01.04.2013
Сообщений: 56

Я так понимаю, что выполнение инструкции for/in, происходит следующим образом: Перед выполнением вложенной инструкции инструкция for/in обойдёт свойства объекта, и присвоит переменной(глобальной) "i" имя последнего свойства?
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2013, 00:59
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Сообщение от doox911 Посмотреть сообщение
Я так понимаю, что выполнение инструкции for/in, происходит следующим образом: Перед выполнением вложенной инструкции инструкция for/in обойдёт свойства объекта, и присвоит переменной(глобальной) "i" имя последнего свойства?
Да нет же, блджад, с чего вы это взяли?:
var obj={
 x:1,
 y:2,
 z:3
};

alert('before start: ' + window.w ) // undefined
for(w in obj){
    alert('in: ' + w); // x... y... z
}
alert('after end: ' + w ) // z

Цикл выполнился, переменная осталась.

P.S. То что при повторном запуске переменная уже назначена - особенность работы скриптового движка сайта - он не пересоздаёт документ каждый раз, а запускает там-же, а тому глобальная переменная остаётся на месте. Используйте f5 перед повторным запуском.
__________________
29375, 35

Последний раз редактировалось Aetae, 02.04.2013 в 01:04.
Ответить с цитированием
  #9 (permalink)  
Старый 02.04.2013, 01:04
Аспирант
Отправить личное сообщение для doox911 Посмотреть профиль Найти все сообщения от doox911
 
Регистрация: 01.04.2013
Сообщений: 56

Сообщение от Aetae Посмотреть сообщение
Да нет же, блджад, с чего вы это взяли?:
var obj={
 x:1,
 y:2,
 z:3
};

alert('before start: ' + window.w )
for(w in obj){
    alert('in: ' + w);
}
alert('after end: ' + w )

Цикл выполнился, переменная осталась.
А как же получается, что переменная "w" после undefined присваивает имена свойств объекта, а не что либо другое?
А точнее, как он понимает что необходимо переменной "w" присвоить имя свойства объекта? (Так написано в книге).

Последний раз редактировалось doox911, 02.04.2013 в 01:08.
Ответить с цитированием
  #10 (permalink)  
Старый 02.04.2013, 01:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Сообщение от doox911 Посмотреть сообщение
А как же получается, что переменная "w" после undefined присваивает имена свойств объекта, а не что либо другое?
А точнее, как он понимает что необходимо переменной "w" присвоить имя свойства объекта? (Так написано в книге).
См. мой первый ответ: for in - конструкция языка.

Ваш вопрос звучит примерно так: как "=" в "a=1" понимает, что надо присвоить переменной "a" значение "1"?
В принципе вы можете почитать спецификацию, чтобы на уровне потрохов языка понять как это работает. Но ведь это тоже не ответ. Скорее всего вам придётся спуститься до уровня ассемблера. Но ведь и это не ответ. Тогда вам надо будет понять физический смысл происходящих в процессоре вычислений. Хотя, боюсь, и это не будет ответом...
__________________
29375, 35

Последний раз редактировалось Aetae, 02.04.2013 в 01:30.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код в консоли хрома работает, а если вписать в сайт - то нет across Javascript под браузер 4 15.08.2012 20:38
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40
Как создать bodyclick код royksopp Общие вопросы Javascript 8 14.10.2011 16:39
Как получит ссылку на элемент внутри которого запустили JS код? aRpi Events/DOM/Window 20 02.10.2011 13:36
Не работает код внутри циклов DZHETIGAPA Events/DOM/Window 1 21.06.2011 01:03