Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.12.2011, 14:39
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 10.12.2011, 14:49
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 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.
Ответить с цитированием
  #3 (permalink)  
Старый 10.12.2011, 15:08
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от B@rmaley.e><e Посмотреть сообщение
Проблема не в операторе присваивания, а в том, что в скобках стоит выражение, которые требует вычисления.
В первых двух случаях, как ни странно, выражения перед скобками вызова () нет.
1) какая еще проблема?) ни какой проблемы нет. есть вопрос как работает РОВНО. и я сделал пример.
2) и зачем вы заменили оператор присваивания запятой? О_О
Ответить с цитированием
  #4 (permalink)  
Старый 10.12.2011, 15:13
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от Livanderiaamarum
и зачем вы заменили оператор присваивания запятой? О_О
Для демонстрации того, что это не специфичное поведение оператора присваивания, а общая черта почти всех операторов.
Ответить с цитированием
  #5 (permalink)  
Старый 10.12.2011, 15:17
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 10.12.2011, 15:28
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Оператор присваивания, как и запятая, вычисляет значение правого аргумента, которое и возвращает.

Возвращено будет значение правого операнда.
Ответить с цитированием
  #7 (permalink)  
Старый 10.12.2011, 15:44
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Livanderiaamarum
НО ЧТО ПРОИСХОДИТ ПОТОМ)? например в случае с РОВНО
= <-- это не равно. Это оператор присваивания.
== <-- вот равно
=== <-- вот идентичность
==== <-- а вот.... нет такого)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2011, 00:20
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от B@rmaley.e><e Посмотреть сообщение
Оператор, как и запятая, вычисляет значение правого аргумента, которое и возвращает.
.


в первом операнде после вычислений лежит не копия обьекта, а ссылка на обьект. В чем дело тогда, почему возвращается обьект?

Последний раз редактировалось Livanderiaamarum, 11.12.2011 в 00:27.
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2011, 00:24
Аватар для Livanderiaamarum
Профессор
Отправить личное сообщение для Livanderiaamarum Посмотреть профиль Найти все сообщения от Livanderiaamarum
 
Регистрация: 10.12.2011
Сообщений: 290

Сообщение от nerv_ Посмотреть сообщение
= <-- это не равно. Это оператор присваивания.
== <-- вот равно
=== <-- вот идентичность
==== <-- а вот.... нет такого)
ты дурачек чтоле? в твоем случае ровно это "два ровно" а именно ==, а в моем случае это ровно то есть =. вобще что ли мозги отмороизл? не сочти за оскорбление, но ты совсем не воспринимаешь информацию.

Последний раз редактировалось Livanderiaamarum, 11.12.2011 в 00:27.
Ответить с цитированием
  #10 (permalink)  
Старый 11.12.2011, 00:45
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

В твоем случае и во всех случаях в JavaScript оператор "=" - oператор присваивания. Этот оператор присваивает значение правого операнда левому.

А равно это "==" - оператор сравнения на равенство. Этот оператор сравнивает два операнда и возвращает Булев результат.

И "===" - оператор тождества. Этот оператор сравнивает два операнда на равенство и возвращает Булев результат. И значения операндов, и их тип данных должны быть идентичны, чтобы оператор возвратил истину.

Так что тебе все верно сказали, и твои обзывания неуместны.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В contains() не подставляется значение переменной Heger jQuery 2 11.12.2011 20:26
Значение переменной salex009 jQuery 1 05.12.2011 16:55
оператор return возвращает значение, а не ссылку. Vertuplatonium Общие вопросы Javascript 4 16.05.2011 14:02