Показать сообщение отдельно
  #13 (permalink)  
Старый 16.07.2012, 18:37
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Все типы делятся на языковые типы и типы спецификации. Тип Reference является одним из типов спецификации. Любое выражение возвращает значение либо одного из языковых типов, либо ссылку.
Интерпретатор всегда знает, какого типа используемое значение.
Операторы . и [] всегда возвращают ссылку, оператор вызова функции может возвращать значение как языкового типа, так и Reference (для встроенных и юзерских объектов всегда языкового типа), все остальные операторы - только значение языкового типа. Идентификатор всегда возвращает ссылку, все остальные примитивные выражение - всегда значение языкового типа.
Правда, в ECMAScript 5.1 есть серьёзная ошибка, связанная с возможностью функций среды возвращать ссылку. Дело в том, что любую функцию можно использовать в качестве геттера или сеттера свойства объекта. Получается, что getValue можут возвращать ссылку, и putValue может принимать ссылку, что приводит к многочисленным недоразумениям.
Интерпретатор может зараннее определить, возвращает ли выражение ссылку или языковое значение, кроме одного случая: выражение является вызовом функции, завёрнутым в произвольное количество скобок (возможно, 0).
Примеры:
alert(1);
'd'++; //SyntaxError: invalid increment operand - бросает зараннее, не выполняя alert

alert(1);
String.fromCharCode(100)++; //ReferenceError: invalid assignment left-hand side - бросает во время выполения, после алерта.

Во втором случае интерпретатор не может зараннее определить, возвратит ли вызов функции языковое значение или ссылку.

Ред. Первый пример работает так, как написано только в Фаерфоксе, и это правильное поведение с точки зрения спецификации. Остальные браузеры сначала выполняют alert, а потом бросают ReferenceError.

Последний раз редактировалось oneguy, 16.07.2012 в 19:51.
Ответить с цитированием