Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контексты, this, объекты и функции, Флейм на тему ссылок this 
:(
    Опции темы
AKS
Дата 28.2.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52




M
Sardar
Тема разделена, оригинал тут: http://forum.vingrad.ru/forum/topic-197524.html


Цитата(Sardar @  28.2.2008,  17:45 Найти цитируемый пост)
Это особенность функций и объектной модели JS - методов не существует.

Как минимум, SpiderMonkey различает то, каким образом вызывается функция – как метод какого-либо объекта или нет:
JS CallFunction
JS CallFunctionName
JS CallFunctionValue


Цитата(Sardar @  28.2.2008,  17:45 Найти цитируемый пост)
Любая функция вызывается в контексте некоторого объекта, где this будет указывать на этот объект...

Сколько ни старался, но так и не смог найти (там, у них) такого определения, как "вызов функции в контексте объекта". Все, что попадается, выглядит совсем иначе:
Цитата

The "current" object on which the function operates; the object specified here is "this" when the function executes.
...
The object on which to call a method. If a method is found and called, obj is passed to it as this.

Т.е. или "функция вызывается на каком-то объекте", или "объект, на котором вызывается метод". Вообще, упрощенно, на js вызов метода выглядит (как мне представляется на сегодняшний день) вот так:
Код

obj.method(argsList) => method.apply(obj, argsList);

Да и в ECMAScript Language Specification оно именно так и выглядит:
Цитата

11.2.3 Function Calls:
...
8. Call the [[Call]] method on Result(3), providing Result(7) as the this value and providing the list Result(2) as the argument values.

, где Result(3) - это js-значение (Function object), а Result(7) - это тот самый объект (а может быть и null), на котором вызвана функция.
Цитата(Sardar @  28.2.2008,  17:45 Найти цитируемый пост)
...но какой-либо жёсткой привязки к этому объекту нет.

Да куда уж жестче, если значение this уже не изменить? И определено оно будет еще до вызова.
Цитата

JS_CallFunction calls a specified function, fun, on an object, obj. In terms of function execution, the object is treated as this.
...
JS_CallFunctionValue executes a function referenced by a jsval, fval, on an object, obj. In terms of function execution, the object is treated as this.
...
JS_CallFunctionName executes a function-valued property, name, belonging to a specified JS object, obj.



PM MAIL   Вверх
Sardar
Дата 28.2.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(smartov @  28.2.2008,  18:46 Найти цитируемый пост)
а что такое _this?

Просто переменная, где то выше инициализированная.

Цитата(AKS @  28.2.2008,  21:11 Найти цитируемый пост)
Как минимум, SpiderMonkey различает то, каким образом вызывается функция – как метод какого-либо объекта или нет:

Детали реализации. Различий как между вызовами как "метод" или "просто функция" - нет, это всегда "как метод", всегда передаётся на ком вызвали. Три нативных функции это разный способ достать JS функцию - либо поиск функции по имени, либо уже готовый объект функции, либо обёрнутый в ссылку. В реализации на Haskell к примеру это будет одна функция, правда при компиляции тоже сделает тучу вариантов (скрыто от тебя). Хотя по моему уже была дискуссия, где выявилось что ECMA разделяет декларации функций 

Код
function name() {...

и функции-closure как значения

Код
var name = function() {...

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

Цитата(AKS @  28.2.2008,  21:11 Найти цитируемый пост)
Сколько ни старался, но так и не смог найти (там, у них) такого определения, как "вызов функции в контексте объекта".

Ты привёл пример синтаксиса (как написать), я говорю о семантике (что означает). Передача функции объекта, на котором вызвали функцию == "вызвать функцию в контексте объекта". По крайней мере мы так среди своих в универе говорим, не формально smile

Цитата(AKS @  28.2.2008,  21:11 Найти цитируемый пост)
Да куда уж жестче, если значение this уже не изменить? И определено оно будет еще до вызова.

Опять детали реализации. Не важно как интерпретатор получит ссылку на объект, будет ли искать его постоянно или положит на стек - для тебя, в синтаксисе (в тексте) всё одно. Да, когда встретим:

Код
my_obj.method();
//интерпретатор сделает подобное:

/*
js_object = lookup(local_context, 'my_obj');
js_func = lookup(js_object, 'method');
//+ аргументы подобным образом

js_result = js_callFunction(js_func, js_object, js_args);
*/

Где объект функции держит свой local_context где она была определена, который отведён от боле верхнего до global (здесь global - объект из ECMA, в JS это window). Можно усложнить, можно упростить, зависит от языка и требований (thread-safe к примеру). К самому JS это отношения не имеет, функция всегда вызывается на каком то объекте, где global.func(); и func(); идентичны. Функция не имеет привязки к объекту на подобии

Код
var a = some_object.method;
a(); //ожидаем что вызвали some_object.method(), но вызывается some_object.method.apply(global, arguments)

//а всё, потому что функция может принадлежать к множеству объектов, нет не являясь частью прототипа,
//а реально быть присвоена к множеству объектов. В конце концов "определение метода" в JS ничего более
//чем создание новой переменной this.method и присвоения ей значения-функции.
//имея такую функцию на руках узнать к какому (каким) объектам она принадлежит не возможно



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
AKS
Дата 29.2.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
Передача функции объекта, на котором вызвали функцию == "вызвать функцию в контексте объекта". 

Опять то же самое. Я ведь о том и пишу, что нет никакой "передачи объекта функции". Если говорить о контексте, в котором вызывается функция, то это execution context (глобальный контекст, локальный контекст или еще бог знает какой), представляющий собой сложный набор данных. Ни о каком контексте объекта, на котором вызвана функция (метод), эта функция понятия не имеет. Она лишь будет иметь в своем распоряжении значение (то самое значение, указывающее на объект) для this keyword, которое будет определено еще до начала выполнения функции.

Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
По крайней мере мы так среди своих в универе говорим, не формально smile

В универе – это одно, а здесь в результате мы видим то, что ни в ECMAScript Language, ни где-то поблизости днем с огнем не найти (я имею ввиду такой термин, как slot, например):
Цитата(Sardar @  28.2.2008,  17:45 Найти цитируемый пост)
...возвращает функцию в slot'е refresh объекта _this.

Приходится ломать голову над трактовкой – то ли это что-то новенькое в ES, то ли это метафора, то ли речь идет об адресации к динамической памяти (к которой сам ES вообще никакого отношения не имеет).

Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
...объект функции держит свой local_context где она была определена, который отведён от боле верхнего до global

Сам context она не держит. Как я уже писал, контекст – это многогранная информация, которой нет места в scope chain. Если представить это так, как определено в спецификации языка, то в [[Scope]] property функции должна быть цепочка, состоящая из activation objects окружения, в котором функция была создана (там же могут оказаться те, что были добавлены усилиями with или catch). И никакого "своего local_context, где она была определена".
Взять хотя бы this value, ассоциирующееся с выполняемым контекстом. Этого значения нет и быть не может в [[Scope]] property функции.

Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
здесь global - объект из ECMA, в JS это window

window === global:
Цитата

ECMAScript Language Specification:
10.1.5 Global Object
... in the HTML document object model the window property of the global object is the global object itself.

Более того, global object может быть доступен благодаря this keyword в глобальном контексте. С помощью того же this объект global можно заполучить в любом другом контексте таким образом:
Код

var global = function () { return this; }();


Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
...функция всегда вызывается на каком то объекте, где global.func(); и func(); идентичны. 

Отнюдь нет. Во втором случае идентификатор func может оказаться методом любого объекта из scope chain активного контекста выполнения, и им может оказаться вовсе не global.

Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
Функция не имеет привязки к объекту на подобии

Речь о привязке к объекту шла совсем в ином контексте (в другом смысле):
Цитата(Sardar @  28.2.2008,  17:45 Найти цитируемый пост)
Любая функция вызывается в контексте некоторого объекта, где this будет указывать на этот объект, но какой-либо жёсткой привязки к этому объекту нет.

Т.е речь шла непосредственно о вызове на некотором объекте, и тут уж привязка достаточно жесткая.
PM MAIL   Вверх
smartov
Дата 29.2.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



AKS, может ну его к черту этого сферического коня в вакууме? Семантика, предложенная Sardar, вполне оправданна и помогает понять суть. К чему эти высокофилософские споры?
PM MAIL   Вверх
Zeroglif
Дата 29.2.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



smartov, 

не мешай, я только попкорн принёс и уселся поудобней...  smile 
PM MAIL WWW   Вверх
AKS
Дата 29.2.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(smartov @  29.2.2008,  11:00 Найти цитируемый пост)
AKS, может ну его к черту этого сферического коня в вакууме? Семантика, предложенная Sardar, вполне оправданна и помогает понять суть. К чему эти высокофилософские споры? 

Не надо, так не надо. Я не спорить хотел, а выяснить то, как ближе к "телу". Я ведь на 100% не уверен, что моя формулировка правильная. Мне самому нужно понять, как должно быть. Форум – это хорошая для меня возможность сделать это...
Кстати, а откуда этот "сферический конь в вакууме"? Что это на самом деле? Персонаж из анекдота?

PM MAIL   Вверх
ksnk
Дата 29.2.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  29.2.2008,  11:39 Найти цитируемый пост)
а откуда этот "сферический конь в вакууме"? 

imho, это из попытки физика выдать определение лошадинной силы... Откуда-то из "физики шутят" или еще более ранних...
Цитата(AKS @  29.2.2008,  10:04 Найти цитируемый пост)
window === global

ЕСли попридираться не по делу, то вот это утверждение несколько спорное smile В жизни есть , к примеру WSH, в котором объекта window нет вообще, а javascript - есть... есть "встраиваемый" в приложения Javascript, в котором бывает все, включая черта в ступе...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 29.2.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(ksnk @  29.2.2008,  11:54 Найти цитируемый пост)
Откуда-то из "физики шутят" или еще более ранних...

Если это тот самый анекдот, то тогда это мимо нот (т.е. не ко мне). Я лишь пытаюсь использовать имеющуюся терминологию, а не придумываю какую-то свою семантику.

Цитата(ksnk @  29.2.2008,  11:54 Найти цитируемый пост)
ЕСли попридираться не по делу...

Не по делу – это любой может, а Вы по делу попробуйте. Смотрите за ходом:
Цитата(Sardar @  28.2.2008,  22:58 Найти цитируемый пост)
global - объект из ECMA, в JS это window

, далее, в контексте "в JS это window":
Цитата(AKS @  29.2.2008,  10:04 Найти цитируемый пост)
window === global:

и подтверждение из ES:
Цитата

...in the HTML document object model the window property of the global object is the global object itself.

, т.е. если уж есть window, то это и есть global.

PM MAIL   Вверх
smartov
Дата 29.2.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



AKS, 
Цитата(AKS @  29.2.2008,  10:39 Найти цитируемый пост)
Кстати, а откуда этот "сферический конь в вакууме"? Что это на самом деле? Персонаж из анекдота?

Да. Сначала из анекдота. Потом... Ну в общем нарицательным стало. Аналог "бессмысленная, в приложении к практике, тема" smile 
PM MAIL   Вверх
ksnk
Дата 29.2.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  29.2.2008,  12:14 Найти цитируемый пост)
, т.е. если уж есть window, то это и есть global.

Ну да, в случае если он есть... А если нет - то что - это уже и не JavaScript вовсе? Или вам кажется, что ES придумывался исключительно для использования внутри броузеров и с обязательной поддержкой 
Цитата(AKS @  29.2.2008,  12:14 Найти цитируемый пост)
... HTML document object model ...

 smile ?


Это сообщение отредактировал(а) ksnk - 29.2.2008, 13:33


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sardar
Дата 29.2.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(AKS @  29.2.2008,  09:04 Найти цитируемый пост)
Если говорить о контексте, в котором вызывается функция, то это execution context (глобальный контекст, локальный контекст или еще бог знает какой), представляющий собой сложный набор данных.

Так, давай определимся с понятием контекста. Есть локальный контекст - это набор всех локальных переменных определённых в функции (var выражения). Есть  унаследованный контекст (у тебя scope chain) - это набор всех переменных, видимых на момент определения (создания нового instance) функции - по сути локальный контекст "родительской" функции (представим что самый внешний контекст это локальный контекст гипотетической функции run() {  здесь код самого верхнего уровня }.

Контекст объекта - это набор всех его slot'ов (термин из Smaltalk, откуда прототипные объектное программирование взяло начало). В мире где "методы" и "переменные" объекта находятся в одном адресном пространстве - такие "поля" называются slot'ами. Я думаю ясно почему это удобней, вместо воображаемого разделения на "переменные" и "методы" объекта (некоторые воображают даже классы в JS).

Контекст объекта == this внутри функции, позволяет обращаться к полям (slots) obъекта - задаётся программистом при вызове функции (да, именно программист говорит на каком объекте вызвать функцию, .func() - лишь удобный синтаксис). Объектов масса - значит и разных контекстов масса.

Локальный контекст - создаётся каждый раз при вызове функции, при чём для каждого рекурсивного вызова (а также для каждого треда в multi-threaded движках) создаётся новы экземпляр контекста.

Наследуемый контекст (ECMA: scope chain) - связан с конкретным instance функции. От одной функции можно породить массу instance, каждый будет связан со своим наследуемым контекстом, который существовал в момент когда интерпретатор создавал этот instance - другими словами каждая функция это closure (почти, это дело можно оптимизировать + ECMA по моему различает понятия функция и closure из-за немного разной видимости переменных).

Ну и наконец - контекст == (map(name) => value) - обычно реализуемого хеш-таблицей. Теперь давай опираться от этих понятий и не путать вещи.

Цитата(AKS @  29.2.2008,  09:04 Найти цитируемый пост)
Приходится ломать голову над трактовкой – то ли это что-то новенькое в ES, то ли это метафора, то ли речь идет об адресации к динамической памяти (к которой сам ES вообще никакого отношения не имеет).

А теперь давай отбросим фарисейство и воспользуемся человеческой соображаловкой. Я не использую терминологию ECMA, т.к. перевожу термины на русский по смыслу.

Цитата(AKS @  29.2.2008,  09:04 Найти цитируемый пост)
Сам context она не держит. Как я уже писал, контекст – это многогранная информация, которой нет места в scope chain.

Говорим об одном и том же разными терминами (тупо переименуй абстрактное контекст на более конкретный scope chain).

Цитата(AKS @  29.2.2008,  09:04 Найти цитируемый пост)
Отнюдь нет. Во втором случае идентификатор func может оказаться методом любого объекта из scope chain активного контекста выполнения, и им может оказаться вовсе не global.

Используя global подразумевал переменную, содержащую именно объект global. Дописывать ", где переменная global содержит объект global" в не формальном общении для меня выглядит дико smile

Цитата(AKS @  29.2.2008,  09:04 Найти цитируемый пост)
Т.е речь шла непосредственно о вызове на некотором объекте, и тут уж привязка достаточно жесткая.

Речь шла почему object.method даст функцию не связанную с object. Совершенно естественно, что интерпретатор на момент вызова функции найдёт объект и передаст его функции как this, но тебе в языке это принесёт такую же пользу, как знать, что Земля круглая. А ещё можно построить автомат, в котором object  (, где object содержит объект object, упомянутый в первом предложении  smile ) будет "закодирован" в набор состояний и тогда понятие this в интерпретаторе (в native run-time, не в семантике JS ;-) ) вообще исчезнет. Всё зависит от реализации.


Мантра:

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

Ответ: нет, нельзя, т.к. функция свободна от каких либо ссылок на объекты, к которым она может принадлежать (являясь значением полей), поэтому указывать объект на ком вызываем необходимо.

Но ведь в в N микросекунд, в которые интерпретатор выполняет функцию, он ведь "знает" объект на ком вызвали, значит в этот момент есть"жёсткая привязка"!
Ответ: термин "жёсткая привязка" понят не правильно, реализация тут не при чём, обсуждаем специфику языка. В реализации само понятие объект может отсутствовать, а ссылок не явных (требуемых в разные моменты времени) может быть вообще не ограниченное количество.

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

Перестать задумываться о реализации JS движка, ведь в разных языках и окружениях по разному. Используя общий термин контекст, я к примеру не имею в виду JSContext из SpiderMonkey. Если конвертнуть интерпретатор в машину Тьюринга, то детали из SpiderMonkey вообще потеряют смысл - заметим, что семантика JS при этом не изменится smile


P.S. извиняюсь, за жёсткий ответ, просто считаю что спор уходит в тупик, когда скатывается до различий в терминологии.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
AKS
Дата 29.2.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(ksnk @  29.2.2008,  13:33 Найти цитируемый пост)
Ну да, в случае если он есть... А если нет - то что - это уже и не JavaScript вовсе? Или вам кажется, что ES придумывался исключительно для использования внутри броузеров и с обязательной поддержкой 

Я ведь написал, что window === global. Что не понятно? И разве я писал что-то об отсутствии window? Вроде бы указал на автора формулы "global - объект из ECMA, в JS это window", так почему ко мне вопросы?

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Есть локальный контекст - это набор всех локальных переменных определённых в функции (var выражения). 

Это не только "var выражения". Это еще и arguments object, и формальные параметры, и объявленные функции, и т.д., и т.п. 

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Есть  унаследованный контекст (у тебя scope chain)

Это не у меня, это в ECMAScript Language Specification. 

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
...это набор всех переменных, видимых на момент определения (создания нового instance) функции - по сути локальный контекст "родительской" функции...

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

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
представим что самый внешний контекст это локальный контекст гипотетической функции run()

Зачем представлять по-своему то, что уже давно представлено? Чтобы подогнать под свою философию?

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
...термин из Smaltalk, откуда прототипные объектное программирование взяло начало

Не аргумент.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Я думаю ясно почему это удобней, вместо воображаемого разделения на "переменные" и "методы" объекта

Я как-раз так не думаю.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
...некоторые воображают даже классы в JS...

Это еще при чем? 

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
ECMA: scope chain

Мне не ясно – для чего подобные оговорки? Мы в каком разделе беседуем?

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
От одной функции можно породить массу instance...

???

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
...другими словами каждая функция это closure

???

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Теперь давай опираться от этих понятий и не путать вещи.

О каких именно понятиях речь? Пока передо мной лишь бессвязная каша – локальные/наследуемые/наборы слотов/this внутри функции/хеш-таблицы. 

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
А теперь давай отбросим фарисейство и воспользуемся человеческой соображаловкой.

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

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Я не использую терминологию ECMA, т.к. перевожу термины на русский по смыслу.

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

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
...тупо переименуй абстрактное контекст на более конкретный scope chain

Очередное определение контекста? Так что же это, в конце концов? И как это последнее, с вашим слов тупо переименованное, увязать с вызовом функции в контексте объекта?

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Используя global подразумевал переменную, содержащую именно объект global. Дописывать ", где переменная global содержит объект global" в не формальном общении для меня выглядит дико smile

Не все могут, также как smartov, понимать Вас с полуслова. Лично у меня не настолько развитая интуиция. Так что пишите сразу, как есть, чтобы потом не оправдываться.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
но тебе в языке это принесёт такую же пользу, как знать, что Земля круглая. 

Любые детали полезны, также как и знание того, что Земля круглая. 

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Мантра:

Да уж...

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
программиста интересует можно ли создать функцию

Да не это его интересовало, господи!

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Как сделать дискуссию конструктивной?

Ответ простой - нужно учиться искусству общения.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)

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

Обсуждать, используя свою доморощенную терминологию? Насколько продуктивным может быть такое обсуждение?

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)

Любой человек всегда способен найти корреляцию между собственной терминологией и терминами используемыми собеседником...

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

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Перестать задумываться о реализации JS движка, ведь в разных языках и окружениях по разному.

Причем тут разные языки и окружения? Есть ECMAScript Language Specification, есть реализации, претендующие на соответствие спецификации – о них и речь. Все остальное, а именно чьи-либо пространные рассуждения, к примеру о машине Тьюринга, не представляет для конструктивной дискуссии ни малейшего интереса.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
я к примеру не имею в виду JSContext из SpiderMonkey.

SpiderMonkey был упомянут, как незначительная частность, или как следствие, если угодно.

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
извиняюсь, за жёсткий ответ, просто считаю что спор уходит в тупик, когда скатывается до различий в терминологии. 

Не стоит извинений. Эмоции - они от недостатка аргументов.

Это сообщение отредактировал(а) AKS - 29.2.2008, 17:58
PM MAIL   Вверх
ksnk
Дата 29.2.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  29.2.2008,  17:53 Найти цитируемый пост)
Вроде бы указал на автора формулы "global - объект из ECMA, в JS это window", так почему ко мне вопросы?

Ну, чтобы придать конкретности - вот та "реальность", для которой мне приходится чего-то писать
Код

Writeln("global " + typeof(global));
Writeln("window " + typeof(window));
Writeln("WriteLn " + typeof(WriteLn));
Writeln("this " + typeof(this));

результат
Код

global undefined
window undefined
WriteLn unknown
this object

Что такое у меня this я так и не разобрался, документацию читать лень, да и потребности пока не вижу... ;-) Что такое global или window в моей "реальности" - вообще неопределено... Тем не менее это самый настоящий JavaScript. Впрочем формула window===global в ней, хоть и бессмысленна, но спарведлива smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sardar
Дата 29.2.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
можно сказать, что унаследованный контекст не является лишь локальным контекстом "родительской" функции.

Это почему же? Вчитайся в мой текст получше. Термин "лишь" - не ограничивает пользователей контекста только функцией, к которой контекст принадлежит, если что...

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Зачем представлять по-своему то, что уже давно представлено? Чтобы подогнать под свою философию?

Странный выпад... Да, не опираюсь на стандарт ECMA дословно, смысл то идентичный. Мало того, в реализации действительно удобно представить самый внешний контекст как просто локальный контекст гипотетической run(). Может приведёшь, что ECMA говорит по этому поводу и где я был не прав?

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Я как-раз так не думаю.

Ну это аргумент обиженного малыша, если честно smile  В чём различия между "простыми" переменными (содержит число к примеру) и "методами" (переменная содержит функцию)?  Только по существу, т.к. на концептуальном уровне для человека пришедшего с ООП это действительно удобно. Увы понятие "концептуальный уровень" - есть инструмент, для лучшего восприятия семантики. Например узнав что такое классы и instaces в Haskell у обычного ООП программиста "расплавятся мозги", проверенно на себе  smile , но поняв, чувствуешь себя как заново родился smile

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Мы в каком разделе беседуем?

Не формальное обсуждение JS. Суть этого топа, по моему было решить - есть ли какая-либо жёсткая привязка функции к объекту, такая, что имея на руках только функцию, можно достать объект, к которому эта функция принадлежит - правда скатываемся до выяснения, чья же терминология лучше и как это кощунственно переводить термины ECMA по смыслу smile    Попутно нырнули в дреби SpiderMonkey, узнали что таки this всегда при вызове функции используется, а три C'шных функции нужны для разного доступа к функции. Ну ещё узнали, что при общении нужно точно указывать, когда говорим о ссылке, а когда о конкретном значении (соглашусь, полезное качество smile ).

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Даже если собеседник ошибается и не хочет признавать своих ошибок? В чем смысл обсуждения, если заблуждающийся упирается руками и ногами?

Где я ошибаюсь? До сих пор наш диалог напоминает:

Цитата
S> эта стенка белая
A> нет!!! эта стенка цвета #FFFFFF, согласно спецификации xxx и вообще ... и ...


Предлагаю взять мои утверждения и опровергнуть. Нет, не доказать, что я не copy-paste термины из спецификации ECMA, а то что изменил смысл терминов. Или хотя бы заблуждаюсь в вопросе ссылок.

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Пока передо мной лишь бессвязная каша

Цитата(AKS @  29.2.2008,  16:53 Найти цитируемый пост)
Ответ простой - нужно учиться искусству общения.

По моему этот топ не приносит больше удовольствие, ни мне, ни тебе. Если снова захочется выкрикнуть подобное, есть PM.

Добавлено через 2 минуты и 38 секунд
ksnk, global (объект, а не переменная с именем "global" если что  smile ), действительно существует в ECMAScript окружении. Оригинальный "браузерный" JS в этом плане отличается, там используется DOM 0 window для этих целей (DOM 0 - общепризнанный термин "унаследованных" window, document и т.д. если что  smile  )


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
AKS
Дата 29.2.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(ksnk @  29.2.2008,  18:26 Найти цитируемый пост)
Что такое у меня this...

Global Object


Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
Вчитайся в мой текст получше.

Вчитываюсь:

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Есть локальный контекст - это набор всех локальных переменных определённых в функции (var выражения).

Ага, вары – локальный контекст. Дальше:

Цитата(Sardar @  29.2.2008,  14:34 Найти цитируемый пост)
Есть  унаследованный контекст ... - это набор всех переменных, видимых на момент определения ... функции - по сути локальный контекст "родительской" функции

Унаследованный контекст – локальный контекст "родительской" функции. А что такое локальный контекст "родительской" функции? Согласно Вам - это вары "родительской" функции. 
Вот я и пишу, что не только лишь.

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
Странный выпад... 

Ничего странного, и уже тем более не выпад. Я пытаюсь понять, зачем нужно уходить в "лес огородами".

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
Может приведёшь, что ECMA говорит по этому поводу и где я был не прав?

Я написал лишь то, что написал, и ни слова о правых и неправых.
Почему не тянет на гипотетической run()? Хотя бы потому, что есть существенные отличия – отсутствует arguments object и формальные параметры. 

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
...для человека пришедшего с ООП это действительно удобно. 

Этот человек начнет для своего удобства искать классы и т.д. Что прикажете делать? Найти и показать их ему? 
Речь не об удобстве – речь о конкретных терминах.

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
...скатываемся до выяснения, чья же терминология лучше...

Я не скатываюсь. Я не собирался выяснять, чья лучше, а чья хуже. Посмотрите, с чего я начал: "А вот там вроде что-то такое есть", "А вот этого я никак найти не могу", "А вот в доках все как-то по-другому".
И мне не нужна моя терминология. Я пытаюсь узнать то, как должно быть. Читали, что я ответил smartov?

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
Где я ошибаюсь?

Да хотя бы с closures. То Вы пишите, что "ECMA разделяет декларации функций и функции-closure как значения":
Код

function name() {...
var name = function() {...

, то вдруг "каждая функция это closure". 

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
Или хотя бы заблуждаюсь в вопросе ссылок.

Каких еще ссылок?

Цитата(Sardar @  29.2.2008,  18:26 Найти цитируемый пост)
По моему этот топ не приносит больше удовольствие, ни мне, ни тебе. 

А что так? Какие есть еще соображения по теме? Я же написал, что я не уверен на 100%, и чтобы понять, нужно обсуждение. Вот, к примеру, у тех, кто пишет Mozilla’вские доки (this Operator) представление почти такое же, как у Вас:
Цитата

The this keyword refers to the context object (a.k.a. current object). In general, in a method, this refers to the calling object.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.