Сообщение от 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.