10.12.2011, 14:39
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
ОПЕРАТОР ПРИСВАИВАНИЯ ПОЛУЧАЕТ ЗНАЧЕНИЕ ССЫЛКИ?
var foo = {
bar: function () {
alert(this);
}
};
foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo
(foo.bar = foo.bar)(); // global?
что происходит в последнем случае? Слева от скобок вызова находится не ССЫЛКА, а РЕАЛЬНОЕ ЗНАЧЕНИЕ ФУНКЦИИ. Но почему? Что поэтапно происходит? Как работает оператор присваивания? И что возвращают скобки " (foo.bar = foo.bar) " ? слева направа он работает или справа налево? Я думал что оператор смотрит что справа ссылка, достает ЗНАЧЕНИЕ обьекта из памяти по той ссылке. Генерирует новую ссылку относительно левого операнда, и кладет эту ссылку в левый операнд. И если все это дело взять в скобки, то скобки (которые не получают значение по ссылкам, а оставляют ссылки ссылками), то скобки должны вернуть левый операнд, а в нем лежит ссылка)), а у нас получается что возвращается не ссылка а РЕАЛЬНОЕ ЗНАЧЕНИЕ по ссылке. (в нашем случае это функция. (реальность значения, и то что оно не ссылка я определил по значению this, которое приняло значение глобального обьекта, а не базы ссылки, и такое происходит только если слева от скобок вызова реальное значение " VALUE() ", а не ссылка " REFERENCE() " ) )
а КАК НА САМОМ ДЕЛЕ работает оператор ровно что и как он достает и.т.п.)?
И почему в данном случае мы получаем реальное значение функции, а не ссылку на неё?
Последний раз редактировалось Livanderiaamarum, 10.12.2011 в 14:50.
|
|
10.12.2011, 14:49
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
var foo = {
bar: function () {
alert(this);
},
toString: function () {
return "Hello, I'm foo!"
}
};
window.toString = function () {
return "Hi, I'm a window"
};
foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo
*!*
(foo.bar, foo.bar)()
*/!*
Проблема не в операторе присваивания, а в том, что в скобках стоит выражение, которые требует вычисления.
В первых двух случаях, как ни странно, выражения перед скобками вызова () нет.
Плохо написал. Напишу согласно стандарту:
1. Оператор группировки (те самые круглые скобки) не вызывает вычисление значения. Таким образом, ссылка, обрамлённая скобками, остаётся ссылкой.
2. Все остальные операторы вызывают вычисление значения. Таким образом, для ссылки вычисляется объект, на который она указывает. При том, для (obj.fnc, obj.fnc) результатом будет значение obj.fnc, то есть fnc без указания базы, т.е. fnc "открепится" от obj.
3. При вызове функции в качестве this будет использована та самая база, которую мы потеряли при вычислении значения.
Последний раз редактировалось B@rmaley.e><e, 10.12.2011 в 15:11.
|
|
10.12.2011, 15:08
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от B@rmaley.e><e
|
Проблема не в операторе присваивания, а в том, что в скобках стоит выражение, которые требует вычисления.
В первых двух случаях, как ни странно, выражения перед скобками вызова () нет.
|
1) какая еще проблема?) ни какой проблемы нет. есть вопрос как работает РОВНО. и я сделал пример.
2) и зачем вы заменили оператор присваивания запятой? О_О
|
|
10.12.2011, 15:13
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от Livanderiaamarum
|
и зачем вы заменили оператор присваивания запятой? О_О
|
Для демонстрации того, что это не специфичное поведение оператора присваивания, а общая черта почти всех операторов.
|
|
10.12.2011, 15:17
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от B@rmaley.e><e
|
Напишу согласно стандарту:
1. Оператор группировки (те самые круглые скобки) не вызывает вычисление значения. Таким образом, ссылка, обрамлённая скобками, остаётся ссылкой.
2. Все остальные операторы вызывают вычисление значения. Таким образом, для ссылки вычисляется объект, на который она указывает. При том, для (obj.fnc, obj.fnc) результатом будет значение obj.fnc, то есть fnc без указания базы, т.е. fnc "открепится" от obj.
3. При вызове функции в качестве this будет использована та самая база, которую мы потеряли при вычислении значения.
|
понятно) все кроме скобок является выражением и достает зачение сыслок. (это кстати я и так знал)
НО ЧТО ПРОИСХОДИТ ПОТОМ)? например в случае с РОВНО)?
var q = 20
(q = q) // что вернут скобки? значение или ссылку? Левого операнда ИЛИ правого?
можно расписать пошагово)? мыл оператор ровно смотрит что справа, потом достает, кладет и.т.п. Мне просто интересно ЧТО БУДЕТ ЯВЛЯТЬСЯ значением выражение в случае с ровно?
Последний раз редактировалось Livanderiaamarum, 10.12.2011 в 15:23.
|
|
10.12.2011, 15:28
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Оператор присваивания, как и запятая, вычисляет значение правого аргумента, которое и возвращает.
Возвращено будет значение правого операнда.
|
|
10.12.2011, 15:44
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Livanderiaamarum
|
НО ЧТО ПРОИСХОДИТ ПОТОМ)? например в случае с РОВНО
|
= <-- это не равно. Это оператор присваивания.
== <-- вот равно
=== <-- вот идентичность
==== <-- а вот.... нет такого)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
11.12.2011, 00:20
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от B@rmaley.e><e
|
Оператор, как и запятая, вычисляет значение правого аргумента, которое и возвращает.
.
|
в первом операнде после вычислений лежит не копия обьекта, а ссылка на обьект. В чем дело тогда, почему возвращается обьект?
Последний раз редактировалось Livanderiaamarum, 11.12.2011 в 00:27.
|
|
11.12.2011, 00:24
|
|
Профессор
|
|
Регистрация: 10.12.2011
Сообщений: 290
|
|
Сообщение от nerv_
|
= <-- это не равно. Это оператор присваивания.
== <-- вот равно
=== <-- вот идентичность
==== <-- а вот.... нет такого)
|
ты дурачек чтоле? в твоем случае ровно это "два ровно" а именно ==, а в моем случае это ровно то есть =. вобще что ли мозги отмороизл? не сочти за оскорбление, но ты совсем не воспринимаешь информацию.
Последний раз редактировалось Livanderiaamarum, 11.12.2011 в 00:27.
|
|
11.12.2011, 00:45
|
|
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
В твоем случае и во всех случаях в JavaScript оператор "=" - oператор присваивания. Этот оператор присваивает значение правого операнда левому.
А равно это "==" - оператор сравнения на равенство. Этот оператор сравнивает два операнда и возвращает Булев результат.
И "===" - оператор тождества. Этот оператор сравнивает два операнда на равенство и возвращает Булев результат. И значения операндов, и их тип данных должны быть идентичны, чтобы оператор возвратил истину.
Так что тебе все верно сказали, и твои обзывания неуместны.
|
|
|
|