Показать сообщение отдельно
  #42 (permalink)  
Старый 14.02.2010, 22:12
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Octane
а да… после операции присваивания мы получим ссылку на функцию. Тогда так:
Метод reverse по завершении алгоритма выполняет return this, а т.к. мы получим на него ссылку в результате операции присваивания, то вызван по этой ссылке он будет в контексте window, и возвратит соответственно window.
Да, но только ещё более правильно не привязываться в объяснении к конкретным "ссылку на reverse", а сказать, что this определяется по тому, как записано выражение вызова. Если слева от точки находится объект типа Reference - то в качестве this будет использована база этого объекта. Если любого другого типа - в качестве this будет использован null. А так как null особого смысла для this не несёт, автоматом подставляется глобальный объект.

Поэтому не важно, куда сохраняется ссылка на reverse (хоть на саму себя), главное, что после присваивания, будет уже не Reference type, и поэтому, this === global:

([].reverse = [].reverse)() === window; // true


На примере выше то же самое можно разобрать: Javascript quiz · Perfection kills

Сообщение от Octane
Сбило то, что ([].reverse)() сохраняет контекст
Вот как раз в этом случае, всё ещё объект типа Reference (оператор группировки не вызывает GetValue), а когда мы выполнили присваивание (которое выполняет GetValue), то получили уже объект типа Function, а не Reference. Соответственно, this будет в конечном итоге определён как global.

Вот здесь разбирали: http://javascript.ru/forum/misc/5724...html#post34117

Сообщение от B@rmaley.e><e
Имхо, зависит от реализации. Если браузер пожелает на этапе прекомпиляции посчитать константы, то почему бы и нет.
Да, текущая версия *Monkey делает оптимизацию в этом случае и для первой функции в коде уже будет 6, а не 2 * 3.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 15.02.2010 в 00:49.
Ответить с цитированием