Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   хитросплетения Global,контекст,this,Reference (https://javascript.ru/forum/misc/3158-khitrospleteniya-global-kontekst-reference.html)

kefi 23.03.2009 15:37

хитросплетения Global,контекст,this,Reference
 
Не въезжаю в стандарт, может кто поможет:
Вот почему так получается :
function al(o){document.write(o,'<br>')} // для html
function al(o){WScript.Echo(o)} ; // для WSH
for (var x in this) al([[x]]) // Здесь Ошибка после распечатки первого значения свойства Глобального объекта (или this, не знаю - совпадут ли они ...) 
// Ошибка выполнения Microsoft JScript: Предполагается наличие объекта


(function qq() {})(); // - вызывает ошибку в for in см выше, если строчку закоментировать, или сделать так v=(function qq() {})() , то ошибки нет ! 
// даже так (function qq() {return {}})() , т.е. вроде как я возвращаю обхект в качестве свойства, но все равно возникает та же ошибка в for in выше
(1); // - та же ошибка в for in
1 ;//  - не вызывает ошибки, т.е. вроде как свойствами глобального объекта могут быть примитивные значения . а не только объекты ?!


Если кто понимает хитросплетения Global,контекст,this,Reference (в стандарте) , объясните, плз, понятными словами , я пока никак не могу въехать.

Zeroglif 23.03.2009 18:40

Точку с запятой надо ставить после al([[x]]).

пысы: "Хитросплетения Global,контекст,this,Reference" понимаю, но желательно получить более конкретный вопрос. ;)

kefi 23.03.2009 20:10

2 Zeroglif > на точку с зпт я - то и не подумал. В этом-то собствно и была причина непоняток.
Вот правда еще есть - ведь все реализации обязаны делать расширяемыми свойства всех своих объектов в том числе и объектов среды типа WScript? Или я не правильно понимаю? Но MS почему-то сделал this.WScript не могущим добавлять новые /переопределять существующие свойства у этог объекта. Как такое понимать ?

Zeroglif 23.03.2009 21:53

Цитата:

Сообщение от kefi
все реализации обязаны делать расширяемыми свойства всех своих объектов

Не обязаны.

kefi 24.03.2009 16:43

Вот еще вопрос :
function al(o){document.write(o,'<br>')} ;
for (var x in this) {al([[x]])      } ; // здесь будет function Person() { al("qqq")   }   ;
function Person() { al("zxc")   }   ;
///*
var Person = function () {al("123")}; 
//	*/
function Person() { al("qqq")   }   ;
al(Person) ; // Здесь распечатается function () {al("123")}
Person() ; // 123 здесь вызовется, соответствующая var Person=function

Почему глобальный объект получает в качестве свойства Person то , которое в строке function Person() ... , а не которое в строке
var Person = function ... ?

twolf 24.03.2009 17:06

потому что вы переопределили Person, т.е. объявили еще раз эту функцию, но другим способом.

Gvozd 24.03.2009 17:11

twolf,
я тоже так подумал сперва.но это не так.
как вы объясните такой код, тогда
function al(o){document.write(o,'<br>')} ;
al(Person) ;

var Person = function () {al("123")}; 
function Person() { al("zxc")   }   ;

al(Person) ;

как видите второй вывод показываете первую функцию, а первый вывод показывает вторую функцию
но с первым выводом понятно.он показывает именованную функцию, поэтому успешно срабатвает до ее определения.

PS я так подозреваю, что сперва в глобальную область видимости пихаются именованные функции, и лиш затем по порядку анонимные.в свете такой теории, становится понятно почему эти два примера так работают

kefi 24.03.2009 17:17

2 twolf ,Gvozd> Да я подправил предыдущий пост

Gvozd 24.03.2009 17:19

походу мои измышления верны только для общего контекста
то есть достаточно обернуть любой из кодов выше просто в фигурные скобочки, для смены контекста, и уже будет работать нормальная логика, с переопределением

все, что я сейчас написал было результатом моих размышлений, а не точным знанием

kefi 24.03.2009 17:19

Цитата:

PS я так подозреваю, что сперва в глобальную область видимости пихаются именованные функции, и лиш затем по порядку анонимные.в свете такой теории, становится понятно почему эти два примера так работают
Так а разве var Person=function ... не есть определение именованной , ей же присваивается имя ?!


Часовой пояс GMT +3, время: 20:42.