![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Sardar |
|
||||||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Ну раз такая тема создалась автоматом...
Вимание: далее рассматриваем метод с точки зрения реализации в JS, а не философию ООП. Надеюсь это вам поможет делать меньше не свойственных/глупых для JS вещей. Что такое метод в JS? Для этого нужно разобраться что такое функция, объект и контекст выполнения функции. Сразу поясним, что в JS функция это не, как обычно, некий блок кода, доступный по имени. Функция это значение, такое же как строка или любой другой объект. На значение могут ссылаться масса ссылок, которые вы и видите как переменные. Это должно быть уже знакомо программистам на Java/C#/PHP/etc. Повторим: переменная это ссылка на значение. Объект функции это фактически ссылка на скомпилированный код функции и на контекст, в котором функция была определена. Созданный объект-функция помещается в переменную с "именем функции", подчеркнём что эта переменная самая обычная переменная и её значение можно изменить на что угодно. Что же такое контекст? Это ключевой объект во всей этой истории, фактически это пространство в котором находятся все переменные определённые в этом контексте. Контекст ссылается на родительский контекст, в котором он был создан, именно по этому мы можем видеть переменные определённые выше по контексту. Повторим: контекст содержит только переменные. Контекстом обладают только функции. Внутри функции любой if/while/for/etc может очерчивать любые блоки с фигурными скобками, всё равно все "определённые" в них переменные будут видны по всей функции (только try/catch имеют "собственную" переменную). Переменные в контексте создаются ключевым словом var. Фактически место под все переменные уже зарезервировано при входе в функцию, так что вынос всех var в блоки "перед тем как они потребуются" не даёт реально никаких оптимизаций. Что бы стало ясно, рассмотрим пример:
В примере видим, что на момент входа в функцию все переменные определённые в контексте в любых if'ах и других конструкциях уже существуют. Фактически контекст имеет фиксированный размер, такой что бы вместить все переменные этого контекста, известный уже на этапе компиляции в байткод/AST. При обращении к переменной контекст смотрит в своих переменных, если не нашёл, то обращается к родительскому контексту. Так происходит до тех пор, пока не упрёмся в самый верхний контекст (гипотетический метод run объекта window или global для настоящих ECMA-262). Далее зависит от типа операции, если это get, то будет ошибка, которую мы успешно ловим в try/catch. Если это set, то переменная с этим именем будет создана в самом верхнем контексте*. Именно по этому я часто говорю, не забываем про var, иначе вы плодите "глобальные" переменные. * А можно ликовать по имени на этапе трансляции, а не искать по хешь-таблицам? Да так и происходит, все обращения к переменным контекстов идут по прямым ссылкам, кроме тех что определены в global. Ещё на этапе трансляции известно, какие переменные не найдены, но компилер не будет ругаться, т.к. они могут "внезапно" появиться в global контексте. Впрочем это не верно для кривого IE, судя по подсказкам к оптимизации, которые предлагает мелкософт. Так, собрали мысли до кучи, попробуем по шагам выполнить код выше. Сначала трансляция скрипта в байткод, получим:
Определим первую операцию над функциями - call(current_context):
"внешней функции", в которой весь скрипт и выполняется. Теперь определим операцию create_function_reference(current_context) - именно этой операции соотвествует конструкция function()...:
Впрочем речь не об этом, внимательно смотрим, что вместе с ссылкой на функцию мы положили и ссылку на текущий контекст. Теперь выполняя эту функцию мы выполняем её в сохранённом контексте и "видим" те переменные. Примером будет ясно:
Кто не знаком с closure может быть сейчас немного удивлён. Да, это удобно, мощно, встречается часто в скриптовых языках поновее, ну и естественно в функциональных (декларативных) языках.Видим, что при вызове функции сохранённый вместе с ссылкой контекст определяет поведение для каждого instance одной и той же функции. Собственно это и называется closure. Повторим: все функции в JS это closure. А где тут объекты и методы, мужики ?! Да, увлеклись, вернёмся к нашим баранам. Мы знаем как вызывается функция и даже определили гипотетическую операцию call для этого. Сразу скажу, этой операции в реальном JS нет, все функции всегда вызываются как методы. Подчеркнём слово как методы, потому как в привычном для Java/C#/C++ программиста, в JS методов нет. Есть вызов в контексте объекта. Ну а объектом может быть что угодно Многие привыкли, что метод это приватное свойство класса, где каждый объект этого класса имеет доступ до этого метода и более никто. Доступ в смысле метод можно выполнить только на этом объекте или на обьектов классов потомков. В JS метод это переменная/поле обьекта, в которой лежит объект-функция. Отсюда будет ясно, почему два объекта, порождённые от одного конструктора и следовательно instanceof constructor_function будет выдавать для них true, могут иметь совершенно разный интерфейс. Это конечно особо извращённый случай, но можно. Объект в JS это пустая хеш-таблица с ссылкой на протитип. Что такое прототип поясним позже, сейчас выделим следующее:
this и указывает. Только для global (в браузере window) можно опустить указание объекта и вызвать "просто функцию". На самом деле мы её вызываем как метод global, следовательно и this указывает на global. Пример, что бы осмыслить всё это:
Вроде всё так гармонично сложилось. Сейчас пойдём в детали и попытаемся угадать ту траву, что курили нетскейповцы и ECMA'вцы, когда писали спецификацию JS. В примере методом служила вложенная функция bla. Фактически не важно какая функция будет использована, можно создавать целые коллекции функционала и "добавлять" его в нужные объекты. Это немного по другому, чем привычное многим наследование по классам, программисты Smalltalk и Objective-C сейчас сразу увидели своё родное. А если ещё и вспомнить всё прочитанное 15 минут назад, то поймём, что все функци в JS это closure, значит и метод может иметь свой собственный контекст откуда угодно. А это значит, что метод будет иметь свои "приватные" поля, которые не обязательно определены в конструкторе объекта. А есть ли способ объявить общие для всех объектов поля? Да, есть и имя ему prototype. Любой объект имеет ссылку на функцию конструктор, которая и инициализировала объект. Эта функция содержит поле .prototype, которое содержит пустой объект. Все поля добавленные в прототип сразу видны и в контексте самого объекта. Пример:
Принцип элементарный, если в хеш-таблице объекта ключа не обнаружено, то иди в прототип конструктора и посмотри там. Вот тут и начинается прикол, в прототип можно добавлять новые поля просто создавая их как в примере выше, а можно заменить объект прототипа полностью другим объектом. При чём чужой объект имеет собственный конструктор с прототипом, т.е. мы автоматом "наследуем" функционал чужого конструктора. Пример:
Вот оно и наследование. Естественно любые изменения в прототипах bla или test тут же будут видны во всех объектах, порождённых от bla (* маленькая оговорка чуть позже). Например если создать String.prototype.my_action = function()..., то во всех строках появится новый метод и можно сразу писать "строка".my_action(). В JS типы динамические, мало того, как мы видим объекты можно собрать с любым интерфейсом тут же на лету. Но оператор <object> instanceof <function> есть, проверяет принадлежность объекта к:
ссылка на прототип сохраняется в самом объекте. Это значит, что породив кучу обьектов, затем сменив прототип и породив ещё кучу обьектов, мы увидим, что только вторая группа будет иметь принадлежность к конструктору прототипа. Сменив прототип функции полностью оригинальный объект мы теряем навсегда, достать даже из ранее созданных обьектов былой прототип нельзя. Хотя эти объекты это прототип "видеть" будут. Также любой объект имеет специальное поле .constructor, от которое указывает на функцию конструктор, т.е. можно создать новые объекты не зная от какой функции этот объект. Впрочем всё гладко работает, пока мы полностью не заменим прототип конструктора... Это всё лучше понять на примере:
Из примера видим, что сменив прототип у функции конструктора, все созданные ранее объекты объявляются как бы "не при делах" и вроде как уже не принадлежат своему конструктору. Мало того, поле constructor они сохраняют, но раз функции родителю больше не принадлежат, значит и собственному конструктору больше не принадлежат. Это не могло быть придумано специально, просто не подумали и допустили полную смену прототипа. Выводы:
AST. Для продвинутых: реализовать вызов функции с созданием контекста на стеке На "краткие" размышления ушло почти 4 часа, на этом заканчиваю. Потом может распишу мелочи, но лучше просто задавайте вопросы кому это всё интересно и не ясно. Добавлено @ 04:22 Млин, это ж обсуждение Все согласные и не согласные с точкой зрения выше прошу отписаться. Если кто сумеет отформатировать с проверкой грамматики текст выше, то поместите пожалуйста на вики. У меня самого точно руки не сразу дойдут до этого. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||||
|
|||||||||||||||
| Cheba |
|
|||
![]() pointless one ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1777 Регистрация: 27.11.2003 Где: /dev/null Репутация: 1 Всего: 62 |
А почему это не оформленно в виде статьи в вики?
|
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Потому что началось с двух строк, а затем меня понесло
Форма изложения не для статьи и сам контент нужно взвесить с дополнениями, вдруг чего упустил. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Zeroglif |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Щаз отпишусь. Мне по-прежнему режет слух слово "ссылка", переменные в javascript содержат только значения.
Контекст - понятие аморфное, более широкое, с ним, например, ассоциировано/связано значение this, для функций есть объект arguments и т.д. и т.п. В более узком конкретном смысле функция (function-value) - это код плюс цепь объектов в лексическом окружении (scope chain), а не плюс "родительский" контекст. Не контекст, а цепь объектов в лексическом окружении (scope chain), которая состоит из определённых объектов (variable objects), у которых в момент конкретизации переменных (variable instantiation) создаются свойства с именами, равными именам переменных, именам формальных параметров, именам объявленных функций. А контекст содержит (если можно так сказать) много чего. Конечно, нет. Зависит от исполняемого кода (global code, function code, eval code). И, в приниципе, можно исключить built-in функции. Исполнение глобального кода согласно документальных указаний партии не связывается с некой run-функцией, отсюда нет смысла это предполагать. Если говорить принципиально о блоках, то, например, реализация от Мозиллы может скрыть внутри блока объявленную функцию.
Почему же ты упорно смешиваешь FunctionDeclaration и FunctionExpression? Мало того, что это разные вещи, так ещё и в разных браузерах эти различия умножены на два. Особенно если у FunctionExpression есть опциональное имя. Никакой это не краткий синтаксис.
В смысле плодим свойства объекта Global (window в браузерах). Спорно. С одной стороны действительно функция несёт на борту цепь объектов в лексическом окружении, а, с другой стороны, замыкание начинает "играть всеми красками" только после того, как переживёт свой лексический контекст, а ещё лучше порождаясь от разных вызовов. Иными словами, то ли считать все функции замыканиями, то ли (как говорит 12345с) только "зомби".
Метод это... Первоисточник нам разъясняет: A function stored in a property of an object is called a method. Отсюда вопрос, чьим методом является "анонимная" function(){} и что это за вызов function(){}()? В какой реализации такое происходит?
Это слишком идеально звучит. Внутри функции через this обращаемся к значению this, а этим значением может быть частенько совем не то, что предписывает ES, особенно в части DOM/BOM перверсий. Мы с тобой уже это как-то обсуждали. У созданных объектов нет такого свойства, это свойства их прототипа. |
||||||||||||
|
|||||||||||||
| Sardar |
|
||||||||||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Ну это опять же, смотря кто/что считает ссылкой и значением
Ошибаешься, this к контексту функции не имеет отношения. Впрочем определение контексту я дал сам, обозначив только переменные функции (куда входят аргументы функции), с точки зрения реализации. this указывает на совершенно другой объект. Кстати поля по this не реально связать на момент трансляции (обращение по имени), переменные контекста наоборот легко "скомпилировать", что бы обращаться по прямой ссылке (имён на этапе выполнения уже нет). Это совершенно два разных механизма. Впрочем с филосовско/логической точки зрения к контексту можно отнести что угодно Определение верное, последнее предложение как уже сказал выше, не совсем. Впрочем это всё вопросы терминологии, говорим об одном и том же. Аргументированно доказать сможешь? Какие нибудь свойства с кодом привести? Единственное, что на ум приходит, это свойство глобального кода, где локальны переменные также являются пропртями/полями global (window), т.е. видимы по this из функций, вызванных на global. Если бы я реализовывал JS, то глобальный код у меня был бы просто самой внешней функцией, ибо логично.
Кстати, а это не правильное поведение. Поднять бы ECMA, там точно стоит, что перед началом выполнения функции все переменные должны быть видны сразу, только мозилловцы не поняли, что функции это тоже переменные. Видать какие их особые детали реализации.
IE и Opera отрабатывают правильно показывая bla в обоих вызовах. Лиса и вероятно все мозиллоподобные на втором вызове кидают исключение, т.к. bla не видна, если if не отработал.
Нука приведи ка цитату из ECMA, где это две разные вещи? Хотя это было моим мнением, как я бы реализовал. Недавно язык свой написал, Forthy, там блоки похожи на функции/closure в JS, физически различий не было, т.к. всё это значение (expression):
Сколько по твоему прокрутим цикл:
Э... другими словами попробуй пояснить, что имеешь в виду? Любая функция в JS может "пережить" свой лексический контекст, если её вернуть или записать в какую переменную.
Повторил несколько раз, это методы global. Повторяем: в JS не методов, есть вызов функии как метода. Просто функция вызывается как метод объекта global. Повторяю: говорим не о философии ООП, а о технической реализации. В моей мнимой, в Rhino по моему тоже, хотя плотно не копался. Примеры? "Не то" в логическом смысле (ты не получил то, что хотел) серьёзно отличается от "не то" когда не согласуется со спецификацией (такого я не видел). Скрипт делает ровно то, что ты ему велишь.
Угу, только этим и объясняется то странное поведение при смене прототипа. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||||||||
|
|||||||||||||||||||
| Zeroglif |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Не ошибаюсь. Из ECMAScript (10.1.3, 10.1.4, 10.1.7): "Every execution context has associated with it a variable object. Every execution context has associated with it a scope chain. There is a this value associated with every active execution context". Как видишь призрачность контекста раскрывается через основные его механизмы, в кои входят и variable object, и scope chain, и this value и т.д. Если их убрать, то вообще непонятно станет who is who... execution context... А чего доказывать, если нет каких-либо свидетельств того, что глобальный код исполняет некая функция. Нет специфики этой функции, нет особенностей, зато есть чёткое разделение на виды исполняемого кода, где глобальный код выделен отдельно: 10.1.2 Types of Executable Code There are three types of ECMAScript executable code 10.2.1 Global Code The scope chain is created and initialised to contain the global object and no others. Variable instantiation is performed using the global object as the variable object and using property attributes { DontDelete }. The this value is the global object. Своеобразное, как и IE-шное. У каждого свои тараканы. Здесь когда-то пытался разобраться, а позже я нашёл в багзилле разъяснение, в общем-то подтверждающее идею. ES (13), там много цитат. Я бы выделил 4 основных различия: 1) время создания функции, FD как и переменная создаётся (наполняется значением) сразу же, а FE в рантайм; 2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain; 3) зависимость от места обитания, FE c именем именно потому FE, а не FD, ибо находится там, где может быть выражения; 4) совершенно разная реализация в трёх основных браузерах.
Это понятно, я хотел донести, что более правильно, не называть каждую функцию изначально замыканием (вроде "все функции в JS это closure"), а считать таковой только ту, что пережила контекст. Не дави :-) я всё равно не соглашусь. Всё наоборот. В javascript есть методы, и есть этому совершенно чёткие и логические определения: 1) function stored in a property of an object is called a method 2) method is a function associated with an object via a property А вот относительно вызова функции никакого разделения (метод не метод) нет, просто работает(должен работать) строгий алгоритм разбора того, что стоит слева от оператора вызова. И конечно же, согласно этого алгоритма анонимная функция никак не связана с глобальным объектом (каким боком она бы к нему прикрепилась без имени?). При вызове в this будет передан null, который потом сменится на global object. Но справедливости ради, я бы сказал, что анонимная функция тоже может быть неким методом, но для этого её надо записать соответствующим образом, вроде:
Если же брать именованные функции, или функции сохранённые в переменной или непосредственно методы какого-либо объекта, то на этапе создания с точки зрения ООП их можно смело называть методами (как это описывает ES выше), а вот во время вызова всё зависит от формы вызова, свою принадлежность через this они могут и не показывать. В идеале так, это когда сам завёл объект и метод ему прописал. Но DOM/BOM объекты и методы ты же не руками прописываешь, можешь ожидать чего угодно, вспомни self===this в IE, вроде простая операция, а объекты не сводит, чего уж тут о более сложной реализации контекста. Или к примеру, считается, что IE не прав, когда не передаёт this в обработчик через attachEvent, а Мозилла, наоборот, права. А что, Мозилла права с точки зрения ECMAScript и this value? Я сильно сомневаюсь. |
||||
|
|||||
| Sardar |
|
||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Нда... это всё таки не понятки с термином контекста. Ладно, я освобожу его в пользу ECMA. Объявим два Х контекста:
Ладно, этот контекст выполнения действительно отличается, как я уже говорил, тем что не известная переменная с запросом set будет создана и все переменные становятся пропертями global, в остальном поведение как в функции. Интересный пример. Нашёл в ECMA различия между FunctionDeclaration и FunctionExpression. Чем они руководствовались не знаю, но ИМХО ИЕ выдал самый разумный ответ. Заметим, что убери эти поправки из ECMA, то всё функционально останется тем же, просто будет меньше геморроя и ошибок с понятиями чем является сейчас объявление функции, выражением или всё таки декларацией. Спасибо за мысль Фактически можно отследить на этапе трансляции будет ли функция "взята" как closure, следовательно можно провести оптимизации и создавать ссылки с текущим контекстом только когда нужно. Но это скорее детали реализации.
Это логическое определение, мы же описываем техническую реализацию. При чём не просто "а вот так хочу", а реально причины, по которым разработчик интерпретатора мог бы выделить специальные конструкции/случаи, когда это метод не просто значение в проперте. Тут я тоже буду стоять на своём А почему так? Зачем это дополнительное условие в интерпретаторе? Ведь ещё на этапе трансляции можно определить на ком (переменная или global) будет вызов. Впрочем это детали, в конкретной реализации может быть и по твоему.
Не согласен с такими формулировками, нет именнованных функций, нет различия между гипотетической "именнованной" и сохранённой в переменной. Не понимаю утверждения "непосредственно методы", ибо нет такого понятия JS. Впрочем если ECMA называет эти вещи так как ты, то пусть будет так, но я всё равно бы реализовал как можно проще, без лишних свойств никак не проявляемых (ну почти никак) в коде.
Поясни что имел в виду под "показывать принадлежность".
Ну это уже логика окружения, в принципе к JS не имеет отношения. Впрочем ладно, оставим это Так, поправок много, с частью согласен, с частью нет. Надо бы переписать всё это под общую ноту, но как бы не переписать ECMA в новом изложении Предлагаю перенести дискуссию в тему как создать эффективный и быстрый интерпретатор/транслятор JS. Моменты, где ECMA описывает "лишние" условия поведения рассмотреть подробней и попытаться понять, что парнями двигало. Расписать собственную реализацию и плюсы по производительности/логичности, чем те же механизмы описанные в ECMA. В идеале этого может хватить для детальной проработки движка JS, может потом напишу для опыта. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||
|
|||||||||
| Zeroglif |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Дискуссию потихоньку надо сводить на нет, т.к. речь пошла об интерпретаторе/трансляторе JS и его разработке.
Чтоб мы понимали друг друга всё равно нужна единая терминология, тем более, что ES это хлеб не столько даже для программиста, сколько для ваятеля комфорного движка. Расписано детально. Почти.
Не согласен, что FD создаётся сразу (статически), а FE в рантайм (динамически)? Не согласен, что FD не может быть в блоке, а FE может? Не согласен, что у FD своё строгое королевское место, а FE может жить везде, где живёт Expression? Я уж совсем молчу, если у сохранённой в переменной функции есть имя, вот где бушует море различий (правда уже в реализациях):
Я имел в виду методы явно созданные, например, obj.method, в отличие от не явного создания, как это бывает с переменными, декларациями функций и т.д. Это когда значением this является объект, чей метод в данный момент исполняется, например, obj.method(). Идеальный вариант - полное имя, видна принадлежность метода. Или, допустим, мы объявили в глобальном коде функцию F, получим метод объекта Global. Потом вызываем F() или window.F(). И в том и в другом случае значением this является объект, свойством которого является функция F. А если эта функция F объявлена внутри другой функции? Тогда, с одной стороны, это метод Variable Object (метод всё-таки), а, с другой стороны, при вызове "принадлежности" нет (и где же метод). Отсюда вопрос, с какого ракурса вообще рассматривать метод: с точки зрения свойства объекта, с точки зрения вызова и this, с точки зрения... |
||||||||
|
|||||||||
| Sardar |
|
||||||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
ОК, действительно надо будет вырезать это всё в ветку JS, но здесь у меня прав нет.
Убедил, но поведение ИЕ ИМХО более удобное. Синтаксически и то и другое может быть где угодно, мало того, и то и другое является выражением (возвращает значение - функция). Но разделение ради видимости функции выглядит логично, хотя и путает. Убедил, но поведение ИЕ считаю более логичным.
Нет, определить функцию FD синтаксисом можно где угодно, в любом выражении. Другое дело, что FD становится реально декларацией, только если в синтаксическом контексте, где возможен/ожидается statement. А различия всего то в видимости функции.
Имя есть, но по нему нельзя обратится, оно играет только информативную роль (только для восстановления сорца).
Не важно какое у функции имя, по нему нельзя обратиться к функции. В примере функция потеряна. Для ясности, имя функции должно давать доступ до функции или как нибудь функционально проявляться, а не просто тешить нас мыслью, что в каком то из пропертей обьекта-функции записано "имя".
А это что за механизм "не явного создания метода"?
Ты рассматриваешь метод с позиции синтаксиса, я же с принципа выполнения/рантайма. При любом вызове функции будет доступен this и это никогда не будет null. Функцию можно вызвать на любом объекте, не обязательно, что бы это был его метод. Хотя последнее выполняется через метод самой функции, следовательно можно считать рантайм-хаком 2Модератор: пора бы тему порезать и слить в JS. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||||
|
|||||||||||||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Есть. Тут есть права у всех модеров и всех ко-модеров. Да и зачем резать? Быть может всю тему в раздел JS засунуть? Одновременно тема является обсуждением одноимённой страницы в Вики. |
|||
|
||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Zeroglif
- скобки вокруг функции A называются оператором группировки (11.1.6 The Grouping Operator)? |
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Прошу прощения. Ссылка в первом сообщении не работает. Что послужило началом данного диспута? Как я понял кто-то решил реализовать js-движок или нет?
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
vasac, ссылка работает. Просто там пока статьи нет. Здесь идет обсуждение будущей статьи.
|
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Понятно, спасибо.
|
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |