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

Глобальные переменные и контексты в JavaScript. (frei, оценка: 1)
Goto page Previous  1, 2
Author Message
KES
Участник форума



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

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

PostPosted: Wed Sep 05, 2007 9:03 am (написано за 28 секунд)
   Post subject:
Reply with quote

2AKS
=(... Тогда какие же отличия?
Back to top
View user's profile Send private message
AKS
Участник форума



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


PostPosted: Wed Sep 05, 2007 10:18 am (спустя 1 час 15 минут; написано за 3 минуты)
   Post subject:
Reply with quote

KES wrote:
Тогда какие же отличия?
Ну какие отличия могут быть там, где "контекст конструктора объекта" vs "контекст объекта"?
А вообще, вопрос, на который Вы решили ответить, не такой уж простой - прочитайте еще раз. ;)
Back to top
View user's profile Send private message Send e-mail
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Fri Sep 07, 2007 8:20 pm (спустя 2 дня 10 часов 1 минуту; написано за 39 минут 49 секунд)
   Post subject:
Reply with quote

KES wrote:
Интересно узнать, можно ли как нибудь вытянуть список всех локальных переменных?
Список локальных переменных можно "вытянуть", разобрав someFunction.toString() - текст функции.

Привожу участникам форума один интересный пример, когда объект window браузера и встроенная функция , которая многими воспринимается как глобальный контекст, имеет ссылку на разные объекты.

Функция eval() и window.eval() (Opera, FireFox, Neyscape, not IE) действуют по-разному. Всторенная функция eval() выполняет код в текущем локальном контексте. В то время как window.eval() выполняет код всегда в глобальном контексте (подобно execScript() в IE).
Back to top
View user's profile Send private message
dimagolov
Участник форума



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

Location: Christ Church, Barbados

PostPosted: Wed Sep 12, 2007 5:23 am (спустя 4 дня 9 часов 3 минуты; написано за 12 минут 6 секунд)
   Post subject:
Reply with quote

Столкнулся с эфектом, который пока не понимаю как объяснить.
Система мнофреймовая, но интересует нас сейчас только два - top и один вложенный.
Main.html:
Code (JavaScript): скопировать код в буфер обмена
function DC () {
        this.SV = function () {
                alert ('DC.SV');
        };
}

function SV () {
        alert ('top.SV');
}
Child.html:
Code (JavaScript): скопировать код в буфер обмена
function SC () {
        this.oDC = new top.DC(); // Проблемная строка
}

SC.prototype = {
        AA : function () {
                top.SV ();
        }
};

oSC = new SC ();
oSC.AA (); // Если проблемная строка есть, то получаем 'DC.SV', без нее - 'top.SV'
 
Выкрутился вынесением всех ф-й свойств DC совпадающих по именам с глобальными ф-ями в прототип DC. Но понимания происходящего нету....
Догадка такая. Создавая объект new top.DC() мы контекст самой ф-ии DC ставим глобальную облать top и все, на что ссылается this в ней попадает в глобальный контекст top. Иного объяснения не вижу. Но почему именно так происходит мне совсем не очевидно...
Back to top
View user's profile Send private message
AKS
Участник форума



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


PostPosted: Wed Sep 12, 2007 6:31 am (спустя 1 час 7 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

dimagolov wrote:
Если проблемная строка есть, то получаем 'DC.SV', без нее - 'top.SV'
Повезло Вам, а я такого не увидел ни в фреймсете, ни в странице с ифреймом. У меня:
Code (JavaScript): скопировать код в буфер обмена
oSC = new SC ();

oSC.oDC.SV(); // -> 'DC.SV'

oSC.AA(); // -> 'top.SV'
 
Все, как задумано...
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



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

Location: Christ Church, Barbados

PostPosted: Wed Sep 12, 2007 4:14 pm (спустя 9 часов 42 минуты; написано за 3 минуты 33 секунды)
   Post subject:
Reply with quote

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



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

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

PostPosted: Mon Oct 22, 2007 7:22 pm (спустя 1 месяц 10 дней 3 часа 8 минут; написано за 2 секунды)
   Post subject:
Reply with quote

alternateidea.com/blog/articles/2007/7/18/javascript-scope-and-binding
Back to top
View user's profile Send private message
wwt
Guest





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


PostPosted: Wed Nov 07, 2007 11:20 am (спустя 15 дней 15 часов 57 минут; написано за 6 минут 3 секунды)
   Post subject:
Reply with quote

чтото я несовсем уловил суть но:

window.onload=www
function www(){
var Q = '"Пример объявления'; // объявление локальной переменной для этой функции
W = ' переменной.'; // объявление глобальной переменной
var S = W; // создаем локальную копию переменной для текущей функции
alert(Q+S+'"'); // выведет: "Пример объявления переменной."
alert(Q+W+'"'); // выведет: "Пример объявления переменной."
alert(Q+ttt());//выведет: "Пример объявления переменной.Вот и всё."

}
function ttt(){
 W += 'Вот и всё."';// переопределяем значение глобальной переменной
return W //возвращаем
}
Back to top
dimagolov
Участник форума



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

Location: Christ Church, Barbados

PostPosted: Thu Nov 08, 2007 1:53 am (спустя 14 часов 32 минуты; написано за 13 секунд)
   Post subject:
Reply with quote

wwt, а что вызывает сомнения?
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Thu Nov 08, 2007 3:47 pm (спустя 13 часов 54 минуты; написано за 51 секунду)
   Post subject:
Reply with quote

Quote:
W = ' переменной.'; // объявление глобальной переменной
Не объявление глобальной, а присвоение значения переменной из объемлющего контекста. Если ни в одном из контекстов не найдется - прилипнет к глобальному.
Back to top
View user's profile Send private message
Wild Pointer
Заглянувший



Joined: 20 Feb 2008
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 17, 2008 10:56 am (спустя 8 месяцев 8 дней 19 часов 9 минут; написано за 2 минуты 50 секунд)
   Post subject:
Reply with quote

Quote:
var Q = '"Пример объявления'; // объявление локальной переменной для этой функции
W = ' переменной.'; // объявление глобальной переменной
Это то всё понятно, только вот предупреждение: assignment to undeclared variable W
Т.е. я должен где-то заранее описать глобальную переменную?
Или мне просто игнорировать это предупреждение?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



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

Location: Питер

PostPosted: Thu Jul 17, 2008 11:12 am (спустя 16 минут; написано за 49 секунд)
   Post subject:
Reply with quote

Wild Pointer
Предупреждения (наконец-то) для того и нужны, чтобы решать что делать с такой переменной.
А что именно с ней делвть - зависит от автора кода =)
Back to top
View user's profile Send private message
Wild Pointer
Заглянувший



Joined: 20 Feb 2008
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 17, 2008 11:26 am (спустя 14 минут; написано за 46 секунд)
   Post subject:
Reply with quote

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



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

Location: Питер

PostPosted: Thu Jul 17, 2008 11:31 am (спустя 4 минуты; написано за 24 секунды)
   Post subject:
Reply with quote

Wild Pointer
Если позарез нужны глобальные переменные, то можно игнорировать и ошибки. =)
Back to top
View user's profile Send private message
KES
Участник форума



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

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

PostPosted: Sat Nov 08, 2008 11:29 am (спустя 3 месяца 21 день 23 часа 57 минут; написано за 58 секунд)
   Post subject:
Reply with quote

Wild Pointer wrote:
А если позарез нужны глобальные переменные, то игнорировать предупреждение или нет?
window['yourVariableName']= 'This is a global value';
аналогично:
yourVariableName= 'This is a global value';

Last edited by KES on Sat Nov 08, 2008 3:35 pm; edited 1 time in total
Back to top
View user's profile Send private message
Guest






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


PostPosted: Sat Nov 08, 2008 12:38 pm (спустя 1 час 9 минут; написано за 2 минуты 58 секунд)
   Post subject:
Reply with quote

Кто и почему делает предупроеждения?
На самом деле объявлять переменные без var соответсвует спецификации, хотя явно это не указывается в спецификации.
Вопрос в другом. В какх случаях это допустимо делать. По-моему в очень оганиченных и контролируемых случаях.
Когда идет инициализация действительно необходимых глобальных переменных внутри функции.
Back to top
Zeroglif
Участник форума



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


PostPosted: Sat Nov 08, 2008 5:51 pm (спустя 5 часов 13 минут; написано за 1 минуту 50 секунд)
   Post subject:
Reply with quote

Anonymous wrote:
На самом деле объявлять переменные без var соответствует спецификации, хотя явно это не указывается в спецификации.
Соответствует, но не указывается явно? В Netscape-овских спеках с самого начала говорилось: "to declare a global variable, declare the variable by assignment, that is simply assign the desired value...". С выходом же стандарта (ECMAScript) стало очевидно, что переменная объявляется только с помощью блатного словечка 'var', никаких тебе вариантов, никакого "declaration by assignment". Но спеки уже не поменялись, та же самая некорректно выраженная идея про "объявление через присваивание" продвигалась из версии в версию (и в JScript, и в JavaScript) в разной трактовке. Думаю, это делалось специально, чтобы не усложнять, не объяснять алгоритмы ES, писал об этом выше. В любом случае, это не объявление переменной в смысле ES, а создание нового свойства глобального объекта. Если знать, что все переменные (variables) - это свойства (properties), но не все свойства - это переменные, то ситуация будет понятна в любой трактовке...
Anonymous wrote:
Вопрос в другом. В каких случаях это допустимо делать. По-моему в очень ограниченных и контролируемых случаях.
Ещё бы знать эти случаи. ;)
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Sat Dec 27, 2008 5:24 pm (спустя 1 месяц 18 дней 23 часа 32 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Объявление глобальной переменной в JavaScript»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (27 Декабря 2008, 20:24).
Back to top
View user's profile Send private message Send e-mail
northernelevators
Заглянувший



Joined: 15 May 2015
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Fri May 15, 2015 10:52 am (спустя 6 лет 4 месяца 18 дней 17 часов 28 минут; написано за 3 минуты 37 секунд)
   Post subject:
Reply with quote

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

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

Локальная переменная - это переменная которая доступна в одной и только одной cnsuperpower.com.
it's so great
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 Previous  1, 2
Page 2 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