Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.03.2009, 15:37
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

хитросплетения 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 (в стандарте) , объясните, плз, понятными словами , я пока никак не могу въехать.

Последний раз редактировалось kefi, 23.03.2009 в 16:08.
Ответить с цитированием
  #2 (permalink)  
Старый 23.03.2009, 18:40
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

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

пысы: "Хитросплетения Global,контекст,this,Reference" понимаю, но желательно получить более конкретный вопрос.
Ответить с цитированием
  #3 (permalink)  
Старый 23.03.2009, 20:10
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

2 Zeroglif > на точку с зпт я - то и не подумал. В этом-то собствно и была причина непоняток.
Вот правда еще есть - ведь все реализации обязаны делать расширяемыми свойства всех своих объектов в том числе и объектов среды типа WScript? Или я не правильно понимаю? Но MS почему-то сделал this.WScript не могущим добавлять новые /переопределять существующие свойства у этог объекта. Как такое понимать ?
Ответить с цитированием
  #4 (permalink)  
Старый 23.03.2009, 21:53
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от kefi
все реализации обязаны делать расширяемыми свойства всех своих объектов
Не обязаны.
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2009, 16:43
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Вот еще вопрос :
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 ... ?

Последний раз редактировалось kefi, 24.03.2009 в 17:16.
Ответить с цитированием
  #6 (permalink)  
Старый 24.03.2009, 17:06
-
Отправить личное сообщение для twolf Посмотреть профиль Найти все сообщения от twolf
 
Регистрация: 16.07.2008
Сообщений: 207

потому что вы переопределили Person, т.е. объявили еще раз эту функцию, но другим способом.
Ответить с цитированием
  #7 (permalink)  
Старый 24.03.2009, 17:11
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

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

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

al(Person) ;

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

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

Последний раз редактировалось Gvozd, 24.03.2009 в 17:14.
Ответить с цитированием
  #8 (permalink)  
Старый 24.03.2009, 17:17
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

2 twolf ,Gvozd> Да я подправил предыдущий пост
Ответить с цитированием
  #9 (permalink)  
Старый 24.03.2009, 17:19
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

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

все, что я сейчас написал было результатом моих размышлений, а не точным знанием
Ответить с цитированием
  #10 (permalink)  
Старый 24.03.2009, 17:19
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

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



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

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