Как работает этот код
var obj={ x:1, y:2, z:3 }; obj.propertyIsEnumerable("toString"); for(w in obj) { console.log(w); alert(w); } Вопрос такой. Я ни где не объявлял переменную "w", как браузер понимает, что Я имел виду. И вообще почему он работает? (Пример взят из книги) Я не понял этот пример. |
"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) |
Прикол в том, что если вывести её до цикла, она хранит имя последнего свойства. Почему?
|
doox911,
потому что объявили ее вы до цикла, в цикле вы уже к ней обращаетесь, и там соответсвенно сохраняется последнее |
Так почему соответственно последнее? И не null например?
|
var w; // Ты объявил w // В цикле твоя w каким-нибудь образом меняется (все это условно) w = 5; w = 8; w = 10; w = 2; alert(w); // И с чего бы w должнa быть null? |
Я так понимаю, что выполнение инструкции 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 перед повторным запуском. |
Цитата:
А точнее, как он понимает что необходимо переменной "w" присвоить имя свойства объекта? (Так написано в книге). |
Цитата:
Ваш вопрос звучит примерно так: как "=" в "a=1" понимает, что надо присвоить переменной "a" значение "1"? В принципе вы можете почитать спецификацию, чтобы на уровне потрохов языка понять как это работает. Но ведь это тоже не ответ. Скорее всего вам придётся спуститься до уровня ассемблера. Но ведь и это не ответ. Тогда вам надо будет понять физический смысл происходящих в процессоре вычислений. Хотя, боюсь, и это не будет ответом... |
Цитата:
Ты ведь понимаешь русский (хотя видимо нет) язык, а JS-движок понимает JS-язык. На русском приветствие будет "Привет". А на js обход всех свойств в цикле будет "for (prop in obj) .." |
Спасибо всем. Вроде допёр.
|
Часовой пояс GMT +3, время: 10:23. |