Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Глобальные переменные и контексты в JavaScript. (frei, оценка: 1)
Goto page 1, 2  Next
Author Message
frei
Заглянувший



Joined: 08 Dec 2005
Posts: 13
Карма: -1
   поощрить/наказать

Location: Киев

PostPosted: Mon Dec 19, 2005 5:48 pm (написано за 4 секунды)
   Post subject: Глобальная переменная
Reply with quote

Подскажите пожалуйста, как объявить глобальную переменную в JavaScript.
И как её менять внутри пользователькой функции.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Mon Dec 19, 2005 6:20 pm (спустя 32 минуты; написано за 48 секунд)
   Post subject:
Reply with quote

Глобальная переменная = локальная в контексте window.

Может быть RTFM сначала?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Dec 30, 2005 2:29 pm (спустя 10 дней 20 часов 9 минут; написано за 39 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
локальная в контексте window
Что значит "локальная в контексте window"? Контекст ведь вроде как создает только функция, window - это объект.
Может быть, "глобальная = свойство window"?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Fri Dec 30, 2005 3:20 pm (спустя 50 минут; написано за 13 минут 28 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Нет, глобальная переменная и свойство window - разные вещи.

Согласен, я несколько погрешил против истины, сократив "локальная в контексте конструктора window" до "локальная в контексте window".

В браузерах все скрипты работают в контексте конструктора объекта window.
Это несколько искуственная ситуация, т.к. на практике с пользовательскими объектами этого не достичь.
При обращении к переменной в контексте функции поиск идёт так:
1. локальные переменные функции
2. глобальные переменные функции
3. свойства объекта window

Тем не менее:
Code (JavaScript): скопировать код в буфер обмена
/*
var test_win = 100;
//test_win = 100;

var a = new function () {
  /*
  var test_a = 200;
//  test_a = 200;

  this.b = new function () {
    var test_b = 300;
    this.test_win = function () { alert(test_win) }
    this.test_a = function () { alert(test_a) }
    this.test_b = function () { alert(test_b) }
  }
}
a.b.test_win(); // 100
a.b.test_a(); // 200
a.b.test_b(); // 300

/*
a.b.new_test_win = function () { alert(test_win) }
a.b.new_test_a = function () { alert(test_a) }
a.b.new_test_b = function () { alert(test_b) }

a.b.new_test_win(); // 100
a.b.new_test_a(); //
a.b.new_test_b(); //
 
Т.е. мы видим, что для методов класса b переменные test_win и test_a являются глобальными.
Но: если добавить функцию в объект b вне конструктора, тогда локальные переменные конструктора будут недоступны.

Ещё интересные моменты при работе с window:
Переменная доступна и как локальная и как свойство window. Удалить её невозможно.
Code (JavaScript): скопировать код в буфер обмена
var test_win = 100;
//delete (test_win)
alert(window.test_win)
alert(test_win)
Переменная доступна и как локальная и как свойство window.
После удаления: 1й вариант выдаст undefined, 2й сгенерирует ошибку "переменная не определена".
Code (JavaScript): скопировать код в буфер обмена
test_win = 100;
//delete (test_win)
alert(window.test_win)
alert(test_win)
Вот таким вот образом.

Резюме: глобальная для функции переменная локальна в контексте объекта window.

Для пользовательских объектов такое положение сохраняется лишь частично:
1. локальные переменные конструктора объекта глобальны для методов объекта (вложенных функций), но недоступны как свойства объекта.
2. свойства объекта глобальны для методов объекта. при этом, обращаться к ним можно используя идентификатор this (текущий контекст), создаваемый на момент инициализации конструктора.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Jan 04, 2006 2:11 am (спустя 4 дня 10 часов 51 минуту; написано за 28 минут 29 секунд)
   Post subject:
Reply with quote

WingedFox

C большим интересом почитал ваш пост, с чем-то, если позволите, не соглашусь.
Quote:
Нет, глобальная переменная и свойство window - разные вещи.
В данном случае объект global и window по сути один объект, при конкретизации глобальных переменных они (переменные)присасываются к window, как его свойства. В этом смысле глобальная переменная - есть свойство window.
Quote:
В браузерах все скрипты работают в контексте конструктора объекта window.
Вы могли бы подробнее на этом остановиться, не совсем понимаю, что такое "контекст конструктора объекта window".
Quote:
При обращении к переменной в контексте функции поиск идёт так:
1. локальные переменные функции
2. глобальные переменные функции
3. свойства объекта window
Под "глобальной переменной функции" имеется в виду переменная без опционального var внутри функции? Если, да, то поиск придёт (если придёт) к ней тогда же, когда и ко всем остальным глобальным переменным (п.3 вашего списка).
Quote:
Резюме: глобальная для функции переменная локальна в контексте объекта window.
При поиске идентификатора опрашиваются поочерёдно объекты scope chain. Для объекта global (он же window) дальше самого объекта ходить не нужно (дальше просто ничего нет), соответственно, не совсем понятно, зачем глобальную переменную называть "локальной в контексте window", в чём глубокий смысл такой терминологии.

p.s. Очень приятный во всех отношениях форум, надеюсь, меня не прогонят... ;-)
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Jan 04, 2006 6:06 am (спустя 3 часа 55 минут; написано за 9 минут 5 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
В этом смысле глобальная переменная - есть свойство window.
1. Глобальный контекст и window - разные вещи. Например, есть WSH. Там window отсутствует, а глобальные переменные есть.
2. Смотрите примеры - я показал разницу между глобальными переменными и свойствами window.
Zeroglif wrote:
Вы могли бы подробнее на этом остановиться, не совсем понимаю, что такое "контекст конструктора объекта window".
Конструктор == функция.
В функции есть локальные переменные. Если внутри функции определить другую функцию, тогда она будет пользоваться локальными переменными "родителя" (функции, внутри которой определена) как глобальными для себя.
Zeroglif wrote:
Под "глобальной переменной функции" имеется в виду
"глобальная переменная" для текущей вложенности (текущего контекста) функции.
Смотрите пример.
Zeroglif wrote:
в чём глубокий смысл такой терминологии.
В том что отнюдь не все функции определяются в контексте window.
Соответственно, у них может быть несколько "глобальных" контекстов. И это надо учитывать при разработке сложных приложений.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Jan 04, 2006 5:06 pm (спустя 10 часов 59 минут; написано за 16 минут 43 секунды)
   Post subject:
Reply with quote

ОК, можно, приводить много примеров о разной реализации host environment с отсутствием window, но это же не отменяет тот факт, что в природе (Ecma-262) существует объект global, и возможна реализация в хосте (DOM) свойства window, ссылающееся на этот global. Соответсвенно, глобальные переменные, равно как и функции верхнего уровня являются свойствами window, о чём справедливо заметил Дмитрий Котеров. Ваш пример ничего не имеет против этого.

Сначала вы использовали термин глобальные переменные функции, сейчас используете (уже в кавычках) "глобальная переменная" для текущей вложенности (текущего контекста) функции. Это по сути понятно, но вносит определённую путаницу, всё-таки глобальная переменная - это переменная вне тела функции или же внутри тела (без var и при отстутствии наложения идентификаторов). Внутри функции любой вложенности переменная (с var) всегда локальная, область её видимости ограничена рамками её собственной функции. Другой вопрос, что дополнительно к концепции глобальная/локальная реализуется концепция поиска (если сразу не нашлось!) вверх по цепочке объектов, привязанных к контексту исполнения, вплоть до объекта global.

п.с. про eval() и проч. умолчу.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Jan 04, 2006 6:42 pm (спустя 1 час 35 минут; написано за 7 минут 14 секунд)
   Post subject:
Reply with quote

Ecma-262 wrote:
10.1.5 Global Object
There is a unique global object (15.1), which is created before control enters any execution context.
Initially the global object has the following properties:
• Built-in objects such as Math, String, Date, parseInt, etc. These have attributes { DontEnum }.
• Additional host defined properties. This may include a property whose value is the global object
itself; for example, in the HTML document object model the window property of the global object is
the global object itself.
As control enters execution contexts, and as ECMAScript code is executed, additional properties may be
added to the global object and the initial properties may be changed.
В т.ч.: mozref.com/reference/objects/Global

1.
Zeroglif wrote:
в хосте (DOM)
Это в корне некорректно. Document Object Model к интерпретатору JavaScript отношения не имеет.
2. Исходя из цитаты стандарта, объект window не является ссылкой на global.
3.
Zeroglif wrote:
Соответсвенно, глобальные переменные, равно как и функции верхнего уровня являются свойствами window
Это не так, что видно из 3 примера. То что глобальная переменная доступна в качестве свойства window - это искючительно особенности реализации интерпретатора.
4.
Zeroglif wrote:
Сначала вы использовали термин глобальные переменные функции, сейчас используете (уже в кавычках) "глобальная переменная" для текущей вложенности (текущего контекста) функции.
Кавычки спокойно можно убрать.
Глобальная переменная - это переменная определённая за пределами тела (контекста) функции (в т.ч. за пределами конструктора объекта).

PS: Если можете дать более корректное/логичное объяснение - напишите его. Вам все будут благодарны.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Jan 04, 2006 9:18 pm (спустя 2 часа 36 минут; написано за 11 минут 10 секунд)
   Post subject:
Reply with quote

Ничего не понимаю, вы привели нужную цитату и тут же начинаете её сами опровергать. Речь идёт о реализации Ecma в движке энного браузера. Стандарт считает допустимым расширение свойств native object, а любой не native object является host object. Далее в приведённой вами цитате читаем, как именно свойство хоста привязывается к global object:
Quote:
Additional host defined properties. This may include a property whose value is the global object
itself; for example, in the HTML document object model the window property of the global object is
the global object itself.
Специально подчеркнул про DOM, хотя это не принципиально, можно считать это свойством (объектом) BOM или DHTML DOM или что-нибудь в этом роде, это не важно, это просто частный случай того, как реализуется стандарт через расширение свойств на хосте. Ваш пример ничего из того, что я говорю не опровергает, покажите код, где бы я не смог достать объявленную глобальную переменную v как window.v.
Quote:
Кавычки спокойно можно убрать.
ОК, убираю кавычки и получаю 2 разных определения глобальной переменной:

1. глобальная переменная для текущей вложенности (текущего контекста) функции;
2. глобальная переменная определённая за пределами тела (контекста) функции (в т.ч. за пределами конструктора объекта).

Про первый пункт я написал, суть понятна, но термин "глобальная" только мешает. Второй пункт не вяжется с глобальной переменной без var внутри тела. Своё объяснение привёл ранее.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Jan 05, 2006 12:06 am (спустя 2 часа 47 минут; написано за 10 минут 1 секунду)
   Post subject:
Reply with quote

Сорри, меня несколько проглючило, мозги не восприняли этот абзац адекватно.
Урок - не писать умные вещи после бессонной ночи 8*)

Глобальная переменная - это переменная определённая за пределами текущего контекста.

Этим и отличаются интерпретируемые языки от компилируемых.
Исторически:
Quote:
Глобальная переменная определяется в основном контексте программы и доступна во всех её функциях.
Вы можете пользоваться именно им.

Я же для работы с JS предпочитаю использовать определение:
Глобальная переменная - это переменная определённая вне текущего контекста.

Просто для того, чтобы не вводить дополнительных определений для переменных, которые локальны в одном контексте, отсутствуют в другом и глобальны в третьем.
Используя моё определение легко объяснить:
WingedFox wrote:
Глобальная переменная = локальная в контексте window.
Лично для меня, значительно удобнее указывать, для какого контекста переменная глобальна.
Эту точку зрения я и попытался донести в своих сообщениях.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Jan 16, 2006 11:13 pm (спустя 11 дней 23 часа 6 минут; написано за 1 минуту 50 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
for example, in the HTML document object model the window property of the global object is
the global object itself
Я эту цитату понимаю так:
Code (JavaScript): скопировать код в буфер обмена
global.window = global; // кольцевая ссылка на себя!
 
Т.е. global и window в браузере - синонимы.

Вообще, очень интересный топик. Осталось только сказать что-нибудь по поводу свойства self, которое в браузере равно window. Зачем оно нужно? Может быть, это устаревшее имя для объекта global? На xpoint в свое время рекомендовали никогда не использовать self; почему?..
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Jan 17, 2006 1:40 am (спустя 2 часа 26 минут; написано за 4 минуты 45 секунд)
   Post subject:
Reply with quote

По поводу self.
Имхо, он введён для удобства программистов, как указатель на текущий контекст.
Т.к. window - это основной (корневой) контекст, то self изначально равен window.

Думаю, на xpoint рекомендовали не использовать self для обращения к свойствам window потому, что self может быть переопределён в конструкторе какого-либо объекта, так что появляется возможность попасть в неправильный контекст.

Window же никому не придёт в голову переопределять. Да и врядли возможно его переопределить 8*)

Вообще, я пожалуй перечитаю стандарт и посмотрю, что именно там говорят про self.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Jan 17, 2006 8:44 am (спустя 7 часов 4 минуты; написано за 33 секунды)
   Post subject:
Reply with quote

WingedFox wrote:
По поводу self. Имхо, он введён для удобства программистов, как указатель на текущий контекст.
Непонятно.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Jan 18, 2006 6:44 pm (спустя 1 день 10 часов 32 секунды; написано за 6 минут 12 секунд)
   Post subject:
Reply with quote

Итак, в стандарте нет упоминания Self.

В интернете есть смутные указания на то, что window должно указывать на корневое окно при работе с фреймами, а self - на сам фрейм.
Логично, но это не так. Во всяком случае - тесты показали, что window всегда равен self.

Кроме того, self должен быть статическим. Это выполняется только в IE.

Похоже, что это ещё какой-то либо рудимент, либо - не реализованная пока возможность.

Дмитрий Котеров
Поскольку может существовать несколько контекстов - статическое окно, динамически создаваемое, модальное, фрейм - содержащих свой собственный документ, то self должен указывать туда, где определена функция, а window - откуда вызывается.
В общем, этого не происходит.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Apr 25, 2006 6:25 pm (спустя 3 месяца 6 дней 23 часа 40 минут; написано за 44 секунды)
   Post subject:
Reply with quote

Быть может с self произошла та же история, что и с null, или что-нибудь еще более непонятное...
Back to top
View user's profile Send private message Send e-mail
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Fri Jun 09, 2006 1:08 pm (спустя 1 месяц 13 дней 18 часов 43 минуты; написано за 1 минуту 50 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
WingedFox wrote:
for example, in the HTML document object model the window property of the global object is
the global object itself
Я эту цитату понимаю так:
Code (JavaScript): скопировать код в буфер обмена
global.window = global; // кольцевая ссылка на себя!
 
Т.е. global и window в браузере - синонимы.
Исходя из того как работает интерпретатор я всегда считил что global это фактически объект-функция, в котором выполняется весь глобальный код. Т.е. это как бы функция, содержащая весь код скрипта. И как для каждой функции интерпретатором создается объект, содержащий локальные переменные, так и для глобальных переменных создается специальный объект содержащий глобальные переменные (которые по сути являются локальными в контексте объекта global). И по-моему window и global - это совсем не одно и то же, поскольку вполне однозначно сказано в спецификации (если я не ошибаюсь), что к глобальному объекту обратиться в принципе не возможно.
Такие выводы я сделал еще и потому, что в ситуации со вложенными функциями, переменные родительской функции по сути являются как бы глобальными для вложенной функции.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Jun 09, 2006 4:09 pm (спустя 3 часа 35 секунд; написано за 1 минуту 14 секунд)
   Post subject:
Reply with quote

Когда я читаю учебник - мне все понятно:
Quote:
Переменная, которая видима во всей программе, называется глобальной.
Переменная, видимая, например, только в рамках конкретной функции, называется локальной.

Томас Пауэлл, Фриц Шнайдер "Полный справочник по JavaScript".
Когда читаю следующее:
Quote:
глобальные переменные, которые по сути являются локальными в контексте...
- непонятно уже ни то, что в учебнике, и ни то, что здесь.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Fri Jun 09, 2006 4:18 pm (спустя 9 минут; написано за 3 минуты 15 секунд)
   Post subject:
Reply with quote

AKS
Если придумаете термин для переменных, которые глобальны для N ф-ций, но локальны для одной, не входящей в эти N - предлагайте.

На данный момент наиболее корректным определением я считаю "глобальная в контексте".

Локальная переменная - это переменная которая доступна в одной и только одной функции.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Jun 09, 2006 5:38 pm (спустя 1 час 20 минут; написано за 16 секунд)
   Post subject:
Reply with quote

Локальная переменная объявляется внутри тела функции (без учёта вложений в неё), глобальная, соответственно, объявляется вне. Все остальные причуды, вроде nested functions, scope chain, closures и проч. можно и нужно представлять себе конкретно как они есть, без изобретения ещё одного глобального контекста внутри локального...
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Fri Jun 09, 2006 7:39 pm (спустя 2 часа 47 секунд; написано за 2 минуты 25 секунд)
   Post subject:
Reply with quote

Нужно знать как оно работает. Как себе их представляет интерпретатор. Именно это важно, на мой взгляд.
А вложенные функции - это не причуды, это одна из основ и сильных сторон языка.
И реально получается что локальность и глобальность - относительные понятия в этой ситуации IMHO.

Я писал софтину, где это был принципиальный момент. И если подходить с другой точки зрения ее было написать нереально.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Jun 10, 2006 2:03 am (спустя 6 часов 23 минуты; написано за 9 минут 34 секунды)
   Post subject:
Reply with quote

DizzZ wrote:
Нужно знать как оно работает. Как себе их представляет интерпретатор.
Оно и их... это про что? ;)
DizzZ wrote:
И реально получается что локальность и глобальность - относительные понятия в этой ситуации IMHO.
Не столько относительные сколько самодельные, в стандарте чёткого определения лок./глоб. переменным нет, поэтому мы и притягиваем за уши некие универсальные тексты, опуская детали из Ecma... К примеру, можно ссылаться на это - If the variable statement occurs inside a FunctionDeclaration, the variables are defined with function-local scope in that function, as described in s 10.1.3. Otherwise, they are defined with global scope..., но всё равно это слишком упрощённо...
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Jun 10, 2006 11:29 am (спустя 9 часов 25 минут; написано за 4 минуты 37 секунд)
   Post subject:
Reply with quote

Zeroglif
А почему Вы пишите, что нет четкого определения лок./глоб. переменным? Вы ведь процитировали стандарт, где как раз речь об этом и идет. К тому же, в Ecma, (вслед за многоточием, на котором закончилась ваша цитата), следует объяснение в скобках, которое, на мой взгляд, достаточно точно характеризует глобальные переменные, а именно (по-русски), переменные, определенные в глобальной области видимости - это переменные, которые создаются как члены глобального объекта.
Вот так вроде бы все просто - если принадлежит Global, значит глобальная, если нет - значит локальная. Кстати, несколько ранее Дмитрий Кóтеров почти процитировал стандарт, предположив:
Quote:
Может быть, "глобальная = свойство window"?
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Jun 10, 2006 3:04 pm (спустя 3 часа 35 минут; написано за 3 минуты 9 секунд)
   Post subject:
Reply with quote

AKS
Quote:
А почему Вы пишите, что нет четкого определения лок./глоб. переменным?
Потому что его нет, чёткого..., а в вышеупомянутой цитате, хоть она и близка к смыслу, но, к примеру, речь в ней идёт только о FunctionDeclaration (динамически создаваемые функции опущены), нет ничего о вложенности и проч.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Jun 10, 2006 6:04 pm (спустя 3 часа 9 секунд; написано за 22 минуты 10 секунд)
   Post subject:
Reply with quote

Zeroglif
Честно говоря, мне трудно понять, куда уж "четче" должно быть определение?
Quote:
...речь в ней идёт только о FunctionDeclaration (динамически создаваемые функции опущены), нет ничего о вложенности и проч.
Ну, написано же в стандарте:
переменная, созданная в глобальной области видимости, будет глобальной, причем создана она должна быть именно при помощи ключевого слова var - ведь только так она сможет получить внутреннее св-во с аттрибутом { DontDelete }, которое, на ряду с возможностью доступа из любого места программы, и характеризует глобальные переменные.
Любые другие - называются локальными хотя бы по причине, что не являются глобальными (а что такое глобальные переменные, я написал выше, вытащив инфо из стандарта). Я многого еще не понимаю, но мне показалось, что ЭТО довольно хорошо прописано в стандарте.
И еще. Вы писали:
Quote:
глобальная переменная - это переменная вне тела функции или же внутри тела (без var и при отстутствии наложения идентификаторов).
Переменная внутри тела функции без var - это не глобальная переменная, т.к. доступна только после выполнения функции и удаляется при помощи оператора delete (т.е. нет у нее св-ва с аттрибутом { DontDelete }). А синтаксис языка для создания переменных таков, что всегда нужно использовать слово var. (Вообще, получается так, что таким образом мы просто напросто определяем новое св-во объекта window. Механизм тот же, что и при записи onload = doSomething или eval("...") - объект window присутствует неявно.) - взял в скобки, т.к. это только мое предположение.

P.S. Ради бога, не подумайте, что я пытаюсь навязать свое мнение, я лишь пытаюсь его изложить, без претензий...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Jun 10, 2006 10:46 pm (спустя 4 часа 42 минуты; написано за 10 секунд)
   Post subject:
Reply with quote

AKS
Quote:
Переменная внутри тела функции без var - это не глобальная переменная, т.к. доступна только после выполнения функции и удаляется при помощи оператора delete (т.е. нет у нее св-ва с аттрибутом { DontDelete }).
Проверить легко. Вызываем функцию и получаем доступную везде глобальную переменную, легко пережившую свой лексический контекст. Идея в том, что несмотря на некоторые процедурные отличия и определённые препятствия в виде возможного конфликта имён, и там и там (и с вар и без вар) мы на выходе получим именованную область памяти, доступную глобально. Иначе говоря, разрешение имён идёт по одному правилу, и в том и в другом случае мы обязательно прицепим к глобальному объекту некие свойства и сможем работать с ними, обращаясь непосредственно к их именам. Что же касается DontDelete, то отсутствие данного свойства никак не отменяет факт наличия самой переменной...
Quote:
А синтаксис языка для создания переменных таков, что всегда нужно использовать слово var.
Крайне желательно, но вовсе не обязательно.

JS 1.5 References (Core/Client-side):
"Using var outside a function is optional but recommended; you can declare a variable by simply assigning it a value. However, it is good style to use var, and it is necessary in functions in the following situations:
- If a global variable of the same name exists.
- If recursive or multiple functions use variables with the same name."


MSDN JScript Reference:
"You can declare a variable without using the var keyword in the declaration and assign a value to it. This is known as an implicit declaration, and it is not recommended. An implicit declaration creates a property of the global object with the assigned name; the property behaves like a variable with global scope visibility."
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Jun 11, 2006 7:27 am (спустя 8 часов 40 минут; написано за 19 минут 51 секунду)
   Post subject:
Reply with quote

Zeroglif
Мне надо было написать вот так, чтобы обсуждение протекало в нужном направлении:
Quote:
А синтаксис языка для создания глобальных переменных таков, что всегда нужно использовать слово var.
Помимо того, что глобальную переменную нельзя объявить в теле функции (ранее Вы сами по этому поводу цитировали стандарт), ее необходимо создать при помощи ключевого слова var. Только тогда, как указано в стандарте, переменная становится членом глобального объекта (E262-3:they are created as members of the global object) и именно глобальной переменной.
Ну а свое предположение я, похоже, взял в скобки напрасно:
Quote:
Вообще, получается так, что таким образом (объявляя переменную внутри тела функции без var) мы просто напросто определяем новое св-во объекта window. Механизм тот же, что и при записи onload = doSomething или eval("...") - объект window присутствует неявно.
- поэтому Вы, наверно, не обратили на это внимание. Но Вы косвенно подтвердили мое высказывание цитатой из MSDN JScript Reference. Там сказано, что при неявном создании переменной (т.е. без var) создается свойство глобального объекта с определенным именем и это свойство ведет себя как переменная из глобальной области видимости. И это behaves like a variable with global scope visibility, как мне кажется, очень важно.
А вот здесь Вы немного ошиблись:
Quote:
Вызываем функцию и получаем доступную везде глобальную переменную.
Здесь речь идет о переменной без var. В первую очередь в стандарте указано, что если переменная встречается внутри функции, то она определяется, как локальная для этой функции. Что с ней происходит далее, мы уже выяснили - она, после вызова функции, становится свойством window (точнее сказать, свойством глобального объекта, но, опять же, мы уже знаем из этого топика, что в HTML свойство window глобального объекта - это и есть сам по себе глобальный объект).

Итак, попробую сформулировать свое ранее описанное предположение так:
Переменные, объявленные неявно (без ключевого слова var), и в коде программы, и в объявлении функции, после выполнения контекста, в котором объявлены, становятся свойствами объекта window и, соответственно, ведут себя, как глобальные переменные. Их можно удалить при помощи оператора delete, чего нельзя сделать с переменными глобальными.
Что думаете по поводу этой формулировки?
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Tue Jun 13, 2006 11:06 pm (спустя 2 дня 15 часов 38 минут; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

Quote:
глобальную переменную нельзя объявить в теле функции
Это так, но это только про var. В цитате упор ставится именно на "variable statement", то есть на наличие определённой конструкции, с помошью которой объявляется переменная ("if the variable statement occurs inside a FunctionDeclaration..." бла-бла-бла). Но нет ни единого слова о неявном объявлении, когда ключевое слово var опущено, и идентификатор в свободном полёте. Цитата ничего не говорит, но и не имеет ничего против фишки с глобальными переменными без var.

Тогда встаёт вопрос, почему вот это неописанное в Ecma некое квази-объявление переменной считается легитимным, и описывается год за годом везде и всюду под вывеской "Объявление переменных", как один из вариантов объявления этой самой глобальной переменной. Я подозреваю, что таким образом мудрые змеи от JS просто срезали терминологические углы, дабы не углубляться в теоретические дебри. Переменная (variable) рассматривается ими без жёсткой привязки к тексту стандарта, скорее на основе принципа разрешения идентификаторов, а если ещё и принять во внимание тот факт, что результатом по-любому станет новое свойство глобального объекта (и с var и в случае без var), то можно предположить, что идея с опциональным var для глобальных переменных стала первым простейшим объяснением. Лично я рассуждал всегда также, не углубляясь, и думал не столько переменными, сколько идентификаторами. Пора исправляться. Предлагаю жесткач:

Переменные (variables) объявляются с помощью ключевого слова var. Неявное объявление переменных - художественный вымысел неизвестного автора. Нет var - нет переменной!
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Jun 14, 2006 7:11 am (спустя 8 часов 5 минут; написано за 2 минуты 18 секунд)
   Post subject:
Reply with quote

Может быть грядущее 4-ое издание ECMAScript, сделав язык типизированным, все-таки сумеет внести ясность?..
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 14, 2006 7:59 am (спустя 47 минут; написано за 53 секунды)
   Post subject:
Reply with quote

Вопрос в том, зачем требуется такое жесткое определение глобальной переменной и как оно поможет в разработке.
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Mon Jun 26, 2006 4:40 pm (спустя 12 дней 8 часов 40 минут; написано за 5 минут 20 секунд)
   Post subject:
Reply with quote

Мне все же приятнее (и понятнее) считать, что глобальность это понятие относительное - так удобнее в разработке.
С другой стороны само название "глобальная" означает "доступная в любом месте программы" - потому переменные, объявленные внутри функции вроде как нельзя назвать глобальными по определению. С другой стороны, если вся прогрмма состоит из одной единственной анонимной функции то объявленные в ней переменные доступны в любом месте порграммы ;)
Короче говоря мы все больше отдаляемся от сути и цепляемся к словам. Для себя (в контексте последних проектов) я называю глобальными только переменные, объявленные вне функций, а те, что объявлены во внешней функции, и доступны вложенной я называю "унаследованные". Потому что надо же их как-то называть, а в спецификациях я не нашел для этого термина :)
Back to top
View user's profile Send private message
safo
Заглянувший



Joined: 19 Jan 2007
Posts: 12
Карма: -3
   поощрить/наказать


PostPosted: Tue Jan 23, 2007 12:18 am (спустя 6 месяцев 26 дней 7 часов 38 минут; написано за 18 минут 57 секунд)
   Post subject:
Reply with quote

Очень интересно было почитать! Есть возможность немного под другими углами взглянуть на контекст.

Возник вопрос. Если не трудно, подскажите, где находится этап "параметры функции"?
WingedFox wrote:
При обращении к переменной в контексте функции поиск идёт так:
1. локальные переменные функции
2. глобальные переменные функции
3. свойства объекта window
Может вопрос не корректный?.. Тогда в двух словах объясните, что я не понимаю.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Jan 23, 2007 12:21 am (спустя 3 минуты; написано за 17 секунд)
   Post subject:
Reply with quote

safo wrote:
Если не трудно, подскажите, где находится этап "параметры функции"?
WingedFox wrote:
1. локальные переменные функции
Back to top
View user's profile Send private message
safo
Заглянувший



Joined: 19 Jan 2007
Posts: 12
Карма: -3
   поощрить/наказать


PostPosted: Tue Jan 23, 2007 12:24 am (спустя 2 минуты; написано за 55 секунд)
   Post subject:
Reply with quote

Благодарю. Я всегда из этого принципа исходил. Но, прочитав тему, несколько усомнился.
Back to top
View user's profile Send private message
Dark-Demon
Участник форума
Banned


Joined: 04 Feb 2007
Posts: 45
Карма: -3
   поощрить/наказать

Location: spb

PostPosted: Wed Feb 07, 2007 10:51 pm (спустя 15 дней 22 часа 27 минут; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

Quote:
В интернете есть смутные указания на то, что window должно указывать на корневое окно при работе с фреймами, а self - на сам фрейм.
Логично, но это не так. Во всяком случае - тесты показали, что window всегда равен self.
да, это синонимы. на корень указывает top, а на родителя - parent.
Quote:
Если придумаете термин для переменных, которые глобальны для N ф-ций, но локальны для одной, не входящей в эти N - предлагайте.
глобальные переменные доступны из любой части программы.
локальные - только в самой функции и в дочерних функциях. при это для дочерних функций переменные родителя являются внешними, а не глобальными.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 3:22 pm (спустя 16 часов 31 минуту; написано за 4 минуты 58 секунд)
   Post subject:
Reply with quote

Dark-Demon wrote:
локальные - только в самой функции и в дочерних функциях. при это для дочерних функций переменные родителя являются внешними, а не глобальными.
Отношения "родительский-дочерний" подходят для вложенных функций первого уровня, но не подходят для более глубоких вложений. Глубоко вложенная функция "видит" родителя, родителя родителя, родителя родителя родителя и т.д.

Last edited by Zeroglif on Thu Feb 08, 2007 4:06 pm; edited 1 time in total
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 3:41 pm (спустя 18 минут; написано за 6 минут 14 секунд)
   Post subject:
Reply with quote

К счастью, наверно, в спецификации нет таких понятий, как "внешние", "дочерние". При выполнении вложенной функции, использующей локальные переменные внешней функции, эти самые переменные будут идентификаторами, поиск которых интерпретатор будет осуществлять во внутреннем св-ве функции [[scope]]. Так что var'ами такие переменные являются лишь для нас (визуально), а для вложенной функции - это идентификаторы, которые еще предстоит найти в scope chain. А тут уже этой функции без разницы - окажутся они глобальными или локальными...
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 5:39 pm (спустя 1 час 58 минут; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

Zeroglif, я не говорил про родителей-детей в общем смысле, а не имел ввиду непосредственного родителя и непосредственное дитя.
Back to top
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 7:22 pm (спустя 1 час 42 минуты; написано за 3 минуты 34 секунды)
   Post subject:
Reply with quote

Anonymous wrote:
я не говорил про родителей-детей в общем смысле, а не имел ввиду непосредственного родителя и непосредственное дитя.
Значит, я неправильно понял. Мне показалось, что вы пытались обобщить ситуацию с локальными переменными.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Tue Sep 04, 2007 5:49 pm (спустя 6 месяцев 23 дня 22 часа 27 минут; написано за 31 минуту 43 секунды)
   Post subject:
Reply with quote

Zeroglif wrote:
Вы могли бы подробнее на этом остановиться, не совсем понимаю, что такое "контекст конструктора объекта window".
Это всё равно, что yourFunction.apply( window, arguments)
попробуйте поэксперементировать:
var a= new obj1();
var b= new obj2();
a.a= 1;
b.b= 2;

function test() {
 for( var i in this ) {
   alert( i+ ' '+ this[i] );
   }
 }

test.apply( a, [] );
test.apply( b, [] );


Интересно узнать, можно ли как нибудь вытянуть список всех локальных переменных?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Sep 04, 2007 8:13 pm (спустя 2 часа 23 минуты; написано за 29 секунд)
   Post subject:
Reply with quote

KES wrote:
Это всё равно, что yourFunction.apply( window, arguments)...
Не-а, не все равно. ;)
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML