Сообщение от monolithed
|
Livanderiaamarum,
var foo = function() {
return this;
};
var bar = {
baz: function () {
return this;
}
};
alert([
foo(), //Window
foo.prototype.constructor(), //Object
bar.baz(), //Object
(bar.baz)(), //Object
(bar.baz = bar.baz)(), //Window
(bar.baz = bar.baz()), //Object
bar.baz //Object
].join('\n'));
Рассмотрим подробнее, что происходит с:
(bar.baz = bar.baz)();
В этом случае, согласно спецификации вызывается метод GetValue().
Это значит, что тип Reference заменяется Function и вызов фунции происходит уже в Window, т.к. this будет null
|
Это я ЗНАЮ)! ну почему НИ КТО не читает внимательно текст топика)!!!!! Вот в чем вопрос, почему reference меняется на VALUE? От куда именно скобки берут ТО что возвращать мне?? Слева от ровно или справа? Слева от ровно по окончанию дествия лежит ссылка. справа тоже лежит ссылка. Значит скобки берут значение И НЕ СЛЕВА ОТ РОВНО и НЕ СПРАВА ОТ РОВНО, тогда откуда)?? или может происходит следущее??
(bar.baz = bar.baz)()
тут яваскрипт начинает вычислять то что в скобках.
и получает следущее
(bar.baz /*и тут ссылка*/ = bar.baz /*тут ссылка*/ )()
Простое присваивание ( = )
Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение = ВыражениеПрисваивания вычисляется по следующей схеме:
1. Вычислить значение ЛевостороннегоВыражения.
2. Вычислить значение ВыраженияПрисваивания.
3. Вызвать ПолучитьЗначение(Результа (2)).
4. Вызвать ЗаписатьЗначение(Результа (1), Результат(3)).
5. Вернуть Результат(3).
по скольку возвращается результат 3, то есть ЗНАЧЕНИЕ правого операнда ровно происходит следущее:
(baz /*тут ЗНАЧЕНИЕ*/)()
потом вступают в дело скобки группировки, и начинают смотреть ЧТО ВНУТРИ НИХ НИХ находится. смотрят - там значение, а не ссылка и возвращают значение. Дальше идут в ход скобки вызова и вызывают эту функцию делая её this равным global(null? но работает как global)
__________________________________________________
моя ошибка была в том что я думал что оператор ровно возвращает не ЗНАЧЕНИЕ правого выражения, а ссылку левого выражения)). и это я и пытался выяснить, и как оказалось тут очень мало людей понмиающих как работает javascript. но все ровно всем спасибо) пошел учить спецификацию.