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 18.04.2009 16:16

2 Zeroglif >
Я не то, чтобы 'упорно', просто не вижу ,как иначе (мои изучения стандарта не дали другого понимания).
Кстати, язык мой был бы птичьим, если бы я специально не вводил определения, а поскольку все определено(частично собственные понятия, частично из спецификации), то он уже понятен.
Объясните тогда этот вопрос так, как Вы считаете нужным его объяснять :
Когда Программа может менять слоты [[Scope]]'a' Замыкания (основная проблема анализа Замыканий) ?
Возможно Вы можете сделать это гораздо проще и яснее, чем я , повторяю, я пока не вижу как проще и яснее.

Zeroglif 18.04.2009 16:52

Цитата:

Сообщение от kefi
Когда Программа может менять слоты [[Scope]]'a' Замыкания (основная проблема анализа Замыканий) ?

Не движемся вперёд никак. Scope (scope chain) - это принадлежность контекста исполнения, список объектов, где ищется идентификатор. [[Scope]] - это принадлежность функции, "закладка" на объекты, которые войдут в будущем (при исполнении) в состав Scope контекста исполнения данной функции.

[[Scope]] статичное свойство, появляется при создании функции и далее уже не меняется в отличие от Scope, меняющейся при каждом вызове. То, что вы называете слотами [[Scope]] - это объекты, ни программа, ни программист не меняют эти "слоты", они лексически "заморожены" специально. Вызывая 100 раз функцию из любого места, вы носите с собой одно и то же значение [[Scope]], добавляя в момент вызова новый VO, что в итоге и формирует scope chain...

kefi 18.04.2009 17:08

2 Zeroglif >
[qoute]
ни программа, ни программист не меняют эти "слоты", они лексически "заморожены" специально. [/quote]
Ну т.е. Вы хотите сказать, что слоты [[Scope]] создаются один раз и навсегда " при создании функции ".
Правда не очень понятно, что имеется ввиду под " при создании функции " ?
Но ладно , не суть, по мне так хоть бы и менялись эти слоты , все равно вопрос останется таким же
Я сам-то имел ввиду то, что ЗНАЧЕНИЯ этих слотов меняются. И вопрос следовательно , если считать , что сами слоты создаются один раз и навсегда будет звучать так :
Когда Программа может менять Значения слотов Скопа Замыкания (основная проблема анализа Замыканий) ?

Dmitry A. Soshnikov 18.04.2009 17:18

Цитата:

Сообщение от kefi
До этих Ваших слов (что я выделил ) мне было все ясно. Но вот они действительно меня запутывают. Мне так хорошо все понималось, когда я считал , что замыкание это процесс присвоения ссылки на FE (myScope = C) переменной или ,точнее , просто использование имени Замыкаемой функции в выражении, и саму такую переменную-ссылку я тоже называл Замыканием.

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

Про примеры, вроде, мы тоже договорились, - что Вы, если хотите понять, приводите простой пример (максимум в 5-10 строк), не переполненный комментариями, переменными, [[Выдуманными Объектами В Двойных Квадратных Скобках]] и т.д.

kefi 18.04.2009 17:27

Цитата:

тогда отпадёт
читал я и его и стандарты - не объясняют они того, что я изложил и ответа на несколько раз поставленный вопрос тоже не дают.
про примеры, Вы посмотрите некоторые свои посты - они гораздо длиннее, ну и что, я Вам благодарен за подобное объяснения, то , что у меня засунуто все объяснение в один пример, так ну и что ? Я Вам уже сказал, что там нет ничего лишнего.
А уж про причудливые названия - 'Замыкание' - не мной придумано, а уж более причудливого я не встречал термина ...
попробуй по нему определи, что тут имелось ввиду...

Zeroglif 18.04.2009 17:32

Цитата:

Сообщение от kefi
Когда

Когда угодно, если есть доступ непосредственно к объекту. Пример:

var b, c;
function A(x) {
    b = function () { alert(x); };
    c = function () { ++x; };
    b(); //-> 1
    // поменяем значение 'x'
    x = 9;
}

A(1);
b(); //-> 9
// поменяем значение 'x'
c(); 
b(); //-> 10


При создании функции 'b' в [[Scope]] будет навсегда "вшит" объект переменных функции 'A'. Изнутри функции 'b' мы cможем обратиться к именам, связь для которых будет найдена в объекте переменных функции 'A', в примере это имя 'x'. НО! не только функция 'b' может работать с объектом переменных функции 'A', но и сама функция 'A' (что очевидно) и любая другая функция, созданная в 'A' и глубже. Это базовый принцип - объект уникален, ссылок на него может быть много...

Dmitry A. Soshnikov 18.04.2009 17:41

Пример:

var a = 10;
function b() {
  var c = 20;
  function d() {
    var e = 30;
    alert([a, c, e, f]);
    f++;
    e++;
  }
  eval('var f = 40;');
  d();
  c++;
  return d;
}
b()();


Видно, что "e++" не имеет смысла, т.к. "e" определяется каждый раз в VO(d), однако, "f++", "c++" "eval('var f = 40;');" - воздействуют на VO(b), и, второй вызов "d" (через b()()) даёт это понять.

Кстати, обратите ещё раз на то, что такое замыкание (например, на b()()). Обратите, закрепите, и не надо больше приравнивать это лишь к "переменной-ссылке на FE".

Цитата:

Сообщение от kefi
ответа на несколько раз поставленный вопрос тоже не дают

Дело в вопросе. Уверен, после примеров неясности отпадут (ну, или, во всяком случае, их станет меньше).

update: а, уже выше есть пример.

kefi 18.04.2009 18:11

Цитата:

Уверен, после примеров неясности отпадут
Я уже вроде как говорил, даже не раз, что неясностей в том смысле, что вы представляете у меня нет.
Дело в том , чтобы изложить то, что я изложил более ясно и кратко без примеров или чтобы был один универсальный пример. Что я и пытался.
Вот Zeroglif отвечает на поставленый вопрос :
Когда угодно, если есть доступ непосредственно к объекту А что это значит ?... Только не надо отвечать, я после того, что написал, понимаю это. Но если бы увидел это впервые , то не понял.


Цитата:

Кстати, обратите ещё раз на то, что такое замыкание (например, на b()()). Обратите, закрепите, и не надо больше приравнивать это лишь к "переменной-ссылке на FE".
Да я не только к переменной ссылке приравнивал, просто с присвоением имени функции переменной ссылке становятся более просты объяснения.
Остальное все нюансы. Например, я так скорректировал бы свое понимание :
Установить Замыкание -
значит использовать Имя Замыкаемой функции или ссылку на нее
в выражении (возможно опосредованно через его вычисление). Частным случаем является присвоение с помощью FE ссылки на Замыкаемую функцию переменной.

Zeroglif 18.04.2009 18:20

Цитата:

Сообщение от kefi
Я уже вроде как говорил, даже не раз, что неясностей в том смысле, что вы представляете у меня нет.

Ну, конечно, мы тут все слепые... ;)

kefi 18.04.2009 18:28

Цитата:

Ну, конечно, мы тут все слепые...
так если не слепые, то зачем себя вести, как слепые ?

Dmitry A. Soshnikov 18.04.2009 18:40

Цитата:

Сообщение от kefi
так если не слепые, то зачем себя вести, как слепые ?

Вы тон смените, пожалуйста, а то я воздержусь от объяснений и рассказов ;) Повторю, всё дело в вопросе (в качестве вопроса). Ну, если разобрались, значит хорошо.

Цитата:

Сообщение от kefi
Установить Замыкание -
значит использовать Имя Замыкаемой функции или ссылку на нее
в выражении (возможно опосредованно через его вычисление).

Слово "установить" здесь - что есть, что нет. Замыкание - это:

1. либо все функции (в виду единого механизма Scope chain);
2. либо, когда функция: (а) имеет свободные переменные, (б) переживает свой контекст.

Всё. Вот эти все "Защитник", "Установить" и т.д. - только больше Вас самого путают.

kefi 18.04.2009 19:36

Цитата:

Вы тон смените, пожалуйста,
Ну как обычно - непонимание порождает агрессию, хотя оно всего лишь непонимание не более того. Не подумайте, что я Вам неблагодарен за Ваше участие, напротив(хорошо видно?). Но я думаю, что :
1) Вам нужно, быть более внимательным к тому, с кем Вы беседуете, чтобы реагировать адекватно .
2) Не надо делать вид, что Вы оказываете одолжение тому, с кем беседуете. Я исхожу из того, что Вам это интересно, иначе бы Вы не отвечали, хотя Вы уже прежде пытались дать понять, что оказываете одолжение .
Короче, менять Вам самому тон или нет - решайте сами. Я со своей стороны просто могу ГАРАНТИРОВАТЬ, что я никогда не провоцирую и не собираюсь провоцировать личностные оценки , как бы Вам это НЕ КАЗАЛОСЬ.

больше самого меня путают. ничего не объясняющие, в отличие от моего объяснения, слова :
Цитата:

либо все функции (в виду единого механизма Scope chain);
Я , конечно, остаюсь новичком, но пока я не встречусь с противным, буду полагать, что говорить о функциях , как о замыканиях бессмысленно, т.к. они НЕ вызывают тех проблем ,что я описал в своих предыдущих постах.
А что касается п2. в определении замыкания , то оно просто неверно :
По нему функция A в след примере будет замыканием:
var g=1 ; function A() { alert(g) }; // Какие проблемы замыкания Вы можете описать в этой программе? Их нет, как и нет замыкания.

Zeroglif 18.04.2009 20:20

Цитата:

Сообщение от kefi
и не собираюсь провоцировать личностные оценки

Личностная оценка неизбежна. Это происходит само собой, в процессе профессионального обсуждения предмета ообычно сразу становится ясен уровень владения этим предметом. К примеру, я бы охарактеризовал kefi, как "энергичного ньюба", от "вялого ньюба" он отличается более высоким уровнем интереса и активностью в дискуссии, которую готов поддерживать. Это можно только приветствовать, пока "энергичный ньюб" не превращается в "отрицающего всё на свете ньюба" - стандарт ему ничего не объясняет, на вопросы его никто не отвечает или отвечают не то, и вообще, не надо было на них отвечать, т.к. он и так всё знает и даже объясняет...

Цитата:

Сообщение от kefi
Их нет, как и нет замыкания.

Преждевременный вывод. Вам нужно вернуться назад и всё-таки разобраться с контекстами и scope chain, после того, как вы поймёте то, как это происходит в javascript, вопрос о замыканиях отпадёт сам собой. ;)

kefi 18.04.2009 20:32

Цитата:

Сообщение от Zeroglif
я бы охарактеризовал kefi

Спасибо за классификацию меня как объекта, субъекта, особь ... , которая осмеливается что-то там объяснять доступное только вам посвященным .
Но прежде , чем выносить суждение о
Цитата:

Преждевременности выводов
неплохо бы было понять аргументы , ах ну да, Вы ж не опуститесь на уровень понимания особи.

Dmitry A. Soshnikov 18.04.2009 20:39

Цитата:

Сообщение от kefi
1) Вам нужно, быть более внимательным к тому, с кем Вы беседуете, чтобы реагировать адекватно .

Спасибо, учту.

Цитата:

Сообщение от kefi
Я исхожу из того, что Вам это интересно, иначе бы Вы не отвечали

"Интересный", всё-таки, подход. "Логично-прагматичное потребление".

Если Вы под "Вам это интересно" подразумеваете "полезную информацию в мою сторону" - так я и так знаю эту информацию, поэтому с этой точки зрения, если отстраниться, мне беседа может быть абсолютно неинтересной.

А вот, если мы возьмём просто беседу, либо беседу в плане помощи тому, кто хочет понять и просит поделиться информацией тех, кто знает - это всегда пожалуйста, всегда интересно. Но, пожалуйста, только без фраз, несущих смысл a-ля "давайте-ка, быстро объясните мне и удовлетворите меня ответами, и нечего себя тут как слепые вести, я поставил вам вопросы, решайте их, вы же только этим занимаетесь и не тратите своё время, когда я одно и то же, выдуманное мной, спрашиваю. Это же так? Конечно так, иначе бы вы не отвечали!". Если я ошибся и мне это, действительно, показалось, мы, конечно, продолжим.

Но, довольно демагогии, надеюсь, мы поняли друг друга :)

А теперь, вернёмся к JS.

Цитата:

Сообщение от kefi
но пока я не встречусь с противным, буду полагать, что говорить о функциях , как о замыканиях бессмысленно

Абсолютно ваше право не принимать/не видеть реальное положение дел. Но есть ли в этом толк - вопрос спорный. ;) Описание этого положения (как одну из теорий о замыканиях в JS) можно найти в ссылке выше.

Цитата:

Сообщение от kefi
А что касается п2. в определении замыкания , то оно просто неверно :

Туда же.

Цитата:

Сообщение от Dmitry A. Soshnikov
Какие проблемы замыкания Вы можете описать в этой программе? Их нет, как и нет замыкания.

А функция становится замыканием, когда у неё появляются какие-то проблемы?

P.S.: да, и...

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

update:

Цитата:

Сообщение от kefi
доступное только вам посвященным .

Цитата:

Сообщение от kefi
ах ну да, Вы ж не опуститесь на уровень понимания особи

Слушайте, хватит демагогии. Отстранитесь от этого и сконцентрируйтесь на предмете. Никто из беседующих (включая Вас, я надеюсь) так не думает.

Zeroglif 18.04.2009 20:51

Цитата:

Сообщение от kefi
спасибо за классификацию

Пожалуйста, так поступает любой. Иначе людям было бы тяжело находить точки соприкосновения и дискуссия была бы роботизирована ака "без эмоциональной окраски".

Цитата:

Сообщение от kefi
которая осмеливается что-то там объяснять

Глупости, все никнеймы равны.

Цитата:

Сообщение от kefi
неплохо бы было понять аргументы

Поднимите тему про замыкания здесь, на хабре, погуглите "zeroglif замыкание", это много обсуждалось на винграде. Там и аргументы, и контрррррр...

Цитата:

Сообщение от kefi
Вы ж не опуститесь

Вы периодически на форуме почемучкаете, а я готов в ответ потомучкать, мне и интересно, и полезно, пока я вижу взаимопонимание. Если же вы упёрлись в "поиск универсального примера, который всё объясняет" и в упор не видите аргументов, не способны переварить стандарт, то это "глухой со слепым"... оно нам нужно?

kefi 18.04.2009 22:08

Цитата:

Сообщение от Dmitry A. Soshnikov
Замыкание - это:
1. либо все функции (в виду единого механизма Scope chain);
2. либо, когда функция: (а) имеет свободные переменные, (б) переживает свой контекст.

Как Вы понимаете смысл термина Замыкание и как он связан с русским словом 'Замыкание' ?
В чем проявляется Замыкание для любой функции из п.1 и для любой из п.2 ? Например, из этой программы : var g=1 ; function A() { alert(g) };
PS. Замечу, что называть ВСЕ функции Замыканиями логически означает уничтожение этого термина, т.к. становится достаточном говорить просто о Функциях, ну или, наоборот, становится ненужным термин Функция.

Dmitry A. Soshnikov 18.04.2009 23:18

Цитата:

Сообщение от kefi
с русским словом 'Замыкание' ?

http://ru.wikipedia.org/wiki/Замыкание

Цитата:

Сообщение от kefi
В чем проявляется Замыкание

Ещё раз - http://javascript.ru/forum/misc/2975...html#post13713 - там достаточно полно описано. Вы сказали, что там непонятно. Что именно не понятно?

Ещё: http://www.jibbering.com/faq/faq_notes/closures.html

Цитата:

Сообщение от kefi
PS. Замечу, что называть ВСЕ функции Замыканиями логически означает уничтожение этого термина, т.к. становится достаточном говорить просто о Функциях, ну или, наоборот, становится ненужным термин Функция.

Касательно классификации и терминологии - естественно. Однако, мы говорим о конкретной технологии (JavaScript) и об одной из теорий, связанной с замыканиями в JS. Конечно же, теория рассматривается в неком аспекте, в неком ключе. За этот аспект принимается механизм Scope chain'a и разрешения имён свойств/переменных. В этом ключе, обращение к свободной переменной одинаково на любых видах функций.

Zeroglif 18.04.2009 23:35

http://forum.vingrad.ru/topic-122262...all/index.html
http://forum.vingrad.ru/index.php?sh...dpost&p=926930

kefi 18.04.2009 23:47

2 Dmitry A. Soshnikov > Вообще вопросы были заданы конкретно Вам, Вы же отсылаете к ссылкам, которые я давно уже читал, кроме jibbering.com, в которой при беглом просмотре я обнаружил гораздо больше моего понимания , чем Вашего относительно того, что :

Замыкание - это:
1. либо все функции (в виду единого механизма Scope chain);
2. либо, когда функция: (а) имеет свободные переменные, (б) переживает свой контекст.
:
A closure is formed by returning a function object that was created within an execution context of a function call from that function call and assigning a reference to that inner function to a property of another object. Or by directly assigning a reference to such a function object to, for example, a global variable, a property of a globally accessible object or an object passed by reference as an argument to the outer function call. e.g:-
function exampleClosureForm(arg1, arg2){
var localVar = 8;
function exampleReturned(innerArg){
return ((arg1 + arg2)/(innerArg + localVar));
}
/* return a reference to the inner function defined as -
exampleReturned -:-
*/
return exampleReturned;
}

var globalVar = exampleClosureForm(2, 4);

ну бог с ним со всем пока ...

Dmitry A. Soshnikov 18.04.2009 23:58

Цитата:

Сообщение от kefi
я обнаружил гораздо больше моего понимания , чем Вашего

:)

Цитата:

Сообщение от kefi
ну бог с ним со всем пока ...

Успехов.

Zeroglif 19.04.2009 00:04

Цитата:

Сообщение от kefi
A closure is formed by returning a function object

Это и называется "пережить контекст"..., и это позиция активных участников c.l.j, считающих, что идея замыкания наиболее полно раскрывается тогда, когда контекст "умер", а функция в нём созданная, "жива"... При этом технически в любой функции всё однотипно.

kefi 25.04.2009 16:21

Может кто-ни объяснить логику проявления след феномена (имеются ввиду результаты 1,2,0 и 2,2,1 ) :
function al(o){document.write(o,'<br>')} ;
function F(a){
//  arguments[0]=2
	a=1;
	arguments[0]=2;
	al([a,arguments[0],arguments.length]);
};
F();F(4); // 1,2,0    2,2,1
al(a); // ошибка a is not defined


??

Yazla 10.11.2009 12:53

Очень информативная тема вышла. Только у меня один ворос, какой скоуп будет у функции, если я добавляю её к прототипу.
Тоесть не так:
function myObj()
{
     this.someMethod = function(){};
}


а так:
function myObj()
{
     
}
myObj.prototype.someMethod = function(){};

Будет ли разница в скоупах в этих случаях у функции someMethod.
Заранее благодарен.

Dmitry A. Soshnikov 10.11.2009 13:03

Yazla, у Вас сейчас путаница между понятиями Scope, [[Scope]] и this-value. Под скоупом, как я вижу, Вы понимаете this-value.

Почитайте последовательно эти статьи:

http://javascript.ru/blog/Dmitry-A.-...kt-peremennyh.

http://javascript.ru/blog/Dmitry-A.-...j-vidimosti.-0

http://javascript.ru/blog/Dmitry-A.-...CHast-3.-This.

Zeroglif 10.11.2009 15:59

Yazla,

Если вызывать потом в контексте созданного объекта:

obj.someMethod()

то разницы нет, т.к. в теории при делегировании происходит автоматическая переадресация сообщений к предку с одновременным связыванием self (- this - в javascript) с получателем сообщения. Иными словами наследуемое свойство или собственное - прозрачно при вызове, и там, и там один и тот же объект.

Yazla 11.11.2009 18:42

Спасибо за ответы, перечитал рекомендуемые статьи. Практически всё понятно. Но возник вопрос. Почему в одном примере "работает" а в другом нет?
function c() {
  function d() {
    alert(x);  
  }
  d();
}
Object.prototype.x=12;
c(); // РАБОТАЕТ т. е. выводит 12



function c() {
  function d() {
    alert(x);  
  }
  d();
}
с.prototype.x=12;
c(); // НЕ работает //undefined


Наверно стоит почитать про прототип. Может посоветуете какую нибудь статью.

Спасибо.

Riim 11.11.2009 19:56

Наверное, потому что window тоже объект и при "Object.prototype.x=12" получает свойство "x".

Dmitry A. Soshnikov 11.11.2009 20:04

Цитата:

Сообщение от Yazla
Object.prototype.x=12; c(); // РАБОТАЕТ т. е. выводит 12

Цитата:

Сообщение от Yazla
с.prototype.x=12; c(); // НЕ работает //undefined

А с чего бы, вдруг, "x" разрешится в "c.prototype"? Scope chain - это цепь объектов переменных. Опрос её при разрешении имени (в данном случае "x") идёт последовательно изнутри вверх. Также, на каждом звене цепи делается просмотр вглубь звена - т.е. анализируется цепь прототипов звена (конкретного объекта переменных в цепи), если она есть. И лишь некоторые объекты переменных могут иметь прототип.

Глобальный объект в Gecko имеет прототип, и наследуется он от Object. Соответственно, всё, что попало в Object.prototype будет найдено при разрешении имени какой-нибудь переменной/свойства - и в данном случае, это "x".

В свою очередь с.prototype никакого отношения к объектам переменных не имеет.

Цитата:

Сообщение от Yazla
Наверно стоит почитать про прототип. Может посоветуете какую нибудь статью.

http://javascript.ru/blog/Dmitry-A.-...-CHast-7.-OOP. - там есть раздел про прототип, но лучше читать статью полностью.

Yazla 20.11.2009 23:34

Цитата:

Сообщение от Dmitry A. Soshnikov
http://javascript.ru/blog/Dmitry-A.-...-CHast-7.-OOP. - там есть раздел про прототип, но лучше читать статью полностью.

Хух, прочитал. Спасибо теперь всё понятно!!!
П.С. Большое спасибо за статьи, это то что я искал.


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