2 Zeroglif >
Я не то, чтобы 'упорно', просто не вижу ,как иначе (мои изучения стандарта не дали другого понимания). Кстати, язык мой был бы птичьим, если бы я специально не вводил определения, а поскольку все определено(частично собственные понятия, частично из спецификации), то он уже понятен. Объясните тогда этот вопрос так, как Вы считаете нужным его объяснять : Когда Программа может менять слоты [[Scope]]'a' Замыкания (основная проблема анализа Замыканий) ? Возможно Вы можете сделать это гораздо проще и яснее, чем я , повторяю, я пока не вижу как проще и яснее. |
Цитата:
[[Scope]] статичное свойство, появляется при создании функции и далее уже не меняется в отличие от Scope, меняющейся при каждом вызове. То, что вы называете слотами [[Scope]] - это объекты, ни программа, ни программист не меняют эти "слоты", они лексически "заморожены" специально. Вызывая 100 раз функцию из любого места, вы носите с собой одно и то же значение [[Scope]], добавляя в момент вызова новый VO, что в итоге и формирует scope chain... |
2 Zeroglif >
[qoute] ни программа, ни программист не меняют эти "слоты", они лексически "заморожены" специально. [/quote] Ну т.е. Вы хотите сказать, что слоты [[Scope]] создаются один раз и навсегда " при создании функции ". Правда не очень понятно, что имеется ввиду под " при создании функции " ? Но ладно , не суть, по мне так хоть бы и менялись эти слоты , все равно вопрос останется таким же Я сам-то имел ввиду то, что ЗНАЧЕНИЯ этих слотов меняются. И вопрос следовательно , если считать , что сами слоты создаются один раз и навсегда будет звучать так : Когда Программа может менять Значения слотов Скопа Замыкания (основная проблема анализа Замыканий) ? |
Цитата:
Про примеры, вроде, мы тоже договорились, - что Вы, если хотите понять, приводите простой пример (максимум в 5-10 строк), не переполненный комментариями, переменными, [[Выдуманными Объектами В Двойных Квадратных Скобках]] и т.д. |
Цитата:
про примеры, Вы посмотрите некоторые свои посты - они гораздо длиннее, ну и что, я Вам благодарен за подобное объяснения, то , что у меня засунуто все объяснение в один пример, так ну и что ? Я Вам уже сказал, что там нет ничего лишнего. А уж про причудливые названия - 'Замыкание' - не мной придумано, а уж более причудливого я не встречал термина ... попробуй по нему определи, что тут имелось ввиду... |
Цитата:
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' и глубже. Это базовый принцип - объект уникален, ссылок на него может быть много... |
Пример:
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". Цитата:
update: а, уже выше есть пример. |
Цитата:
Дело в том , чтобы изложить то, что я изложил более ясно и кратко без примеров или чтобы был один универсальный пример. Что я и пытался. Вот Zeroglif отвечает на поставленый вопрос : Когда угодно, если есть доступ непосредственно к объекту А что это значит ?... Только не надо отвечать, я после того, что написал, понимаю это. Но если бы увидел это впервые , то не понял. Цитата:
Остальное все нюансы. Например, я так скорректировал бы свое понимание : Установить Замыкание - значит использовать Имя Замыкаемой функции или ссылку на нее в выражении (возможно опосредованно через его вычисление). Частным случаем является присвоение с помощью FE ссылки на Замыкаемую функцию переменной. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
1. либо все функции (в виду единого механизма Scope chain); 2. либо, когда функция: (а) имеет свободные переменные, (б) переживает свой контекст. Всё. Вот эти все "Защитник", "Установить" и т.д. - только больше Вас самого путают. |
Цитата:
1) Вам нужно, быть более внимательным к тому, с кем Вы беседуете, чтобы реагировать адекватно . 2) Не надо делать вид, что Вы оказываете одолжение тому, с кем беседуете. Я исхожу из того, что Вам это интересно, иначе бы Вы не отвечали, хотя Вы уже прежде пытались дать понять, что оказываете одолжение . Короче, менять Вам самому тон или нет - решайте сами. Я со своей стороны просто могу ГАРАНТИРОВАТЬ, что я никогда не провоцирую и не собираюсь провоцировать личностные оценки , как бы Вам это НЕ КАЗАЛОСЬ. больше самого меня путают. ничего не объясняющие, в отличие от моего объяснения, слова : Цитата:
А что касается п2. в определении замыкания , то оно просто неверно : По нему функция A в след примере будет замыканием: var g=1 ; function A() { alert(g) }; // Какие проблемы замыкания Вы можете описать в этой программе? Их нет, как и нет замыкания. |
Цитата:
Цитата:
|
Цитата:
Но прежде , чем выносить суждение о Цитата:
|
Цитата:
Цитата:
Если Вы под "Вам это интересно" подразумеваете "полезную информацию в мою сторону" - так я и так знаю эту информацию, поэтому с этой точки зрения, если отстраниться, мне беседа может быть абсолютно неинтересной. А вот, если мы возьмём просто беседу, либо беседу в плане помощи тому, кто хочет понять и просит поделиться информацией тех, кто знает - это всегда пожалуйста, всегда интересно. Но, пожалуйста, только без фраз, несущих смысл a-ля "давайте-ка, быстро объясните мне и удовлетворите меня ответами, и нечего себя тут как слепые вести, я поставил вам вопросы, решайте их, вы же только этим занимаетесь и не тратите своё время, когда я одно и то же, выдуманное мной, спрашиваю. Это же так? Конечно так, иначе бы вы не отвечали!". Если я ошибся и мне это, действительно, показалось, мы, конечно, продолжим. Но, довольно демагогии, надеюсь, мы поняли друг друга :) А теперь, вернёмся к JS. Цитата:
Цитата:
Цитата:
P.S.: да, и... - никогда не делаю вид, что оказываю одолжение при беседе, поэтому, кажется - Вам; - не беседую, если вижу потребительский подход. update: Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
В чем проявляется Замыкание для любой функции из п.1 и для любой из п.2 ? Например, из этой программы : var g=1 ; function A() { alert(g) }; PS. Замечу, что называть ВСЕ функции Замыканиями логически означает уничтожение этого термина, т.к. становится достаточном говорить просто о Функциях, ну или, наоборот, становится ненужным термин Функция. |
Цитата:
Цитата:
Ещё: http://www.jibbering.com/faq/faq_notes/closures.html Цитата:
|
|
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); ну бог с ним со всем пока ... |
Цитата:
Цитата:
|
Цитата:
|
Может кто-ни объяснить логику проявления след феномена (имеются ввиду результаты 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 ?? |
Очень информативная тема вышла. Только у меня один ворос, какой скоуп будет у функции, если я добавляю её к прототипу.
Тоесть не так: function myObj() { this.someMethod = function(){}; } а так: function myObj() { } myObj.prototype.someMethod = function(){}; Будет ли разница в скоупах в этих случаях у функции someMethod. Заранее благодарен. |
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. |
Yazla,
Если вызывать потом в контексте созданного объекта: obj.someMethod() то разницы нет, т.к. в теории при делегировании происходит автоматическая переадресация сообщений к предку с одновременным связыванием self (- this - в javascript) с получателем сообщения. Иными словами наследуемое свойство или собственное - прозрачно при вызове, и там, и там один и тот же объект. |
Спасибо за ответы, перечитал рекомендуемые статьи. Практически всё понятно. Но возник вопрос. Почему в одном примере "работает" а в другом нет?
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 Наверно стоит почитать про прототип. Может посоветуете какую нибудь статью. Спасибо. |
Наверное, потому что window тоже объект и при "Object.prototype.x=12" получает свойство "x".
|
Цитата:
Цитата:
Глобальный объект в Gecko имеет прототип, и наследуется он от Object. Соответственно, всё, что попало в Object.prototype будет найдено при разрешении имени какой-нибудь переменной/свойства - и в данном случае, это "x". В свою очередь с.prototype никакого отношения к объектам переменных не имеет. Цитата:
|
Цитата:
П.С. Большое спасибо за статьи, это то что я искал. |
Часовой пояс GMT +3, время: 11:17. |