Здесь возникает путаница в понятиях. Есть 6 языковых типов, среди которых объект, а есть тип спецификации Reference. Значения типа Reference часто называют ссылками, и значения типа Object часто называют ссылками на объект. Хотя на самом деле Object и Reference - это два совершенно разных типа. Значение переменной и свойства объекта всегда принадлежит языковому типу и не может принадлежать типу Reference.
Значения Reference состоят из 2-х компонент: базы и имени (ещё и флага Strict, но в большинстве случаев его можно не рассматривать). Значение Object являются некоторым внутренним значением (адрес, идентификатор), с помощью которого можно однозначно определить структуру данных, состоящую из свойств, в памяти. Часто называют объектами сами такие структуры данных.
o={x:2,y:3};
b=(false , o); // в данном случае b имеет тип Object, значение переменной никогда не может иметь тип Reference
b.x=7;
alert(o.x);
v=1;
var foo = {bar: function () {alert(this.v);}, v:2};
foo.bar(); // 2
(foo.bar)(); // 2
(foo.bar = foo.bar)(); // 1
(false || foo.bar)(); // 2 (у меня 1)
(foo.bar, foo.bar)(); // 1
В данном случае выражение foo.bar возвращает значение Reference с базой, равной значению переменной foo, и именем "bar". Оператор запятая, если правый операнд возвращает значение Reference, его разыменовывает, и возвращает разыменованное значение. В данном случае это значение типа Reference разыменовывается в функцию с кодом { alert(this.v) }, точнее ссылку на эту функцию и выражение (foo.bar, foo.bar) её (ссылку на функцию, значение типа Object) и возвращает.
Сообщение от dump
|
У меня он выводит 22121. Почему так? Какой программой для запуска пользуетесь?
|
Запускал на тестовой странице, проверял в IE, Firefox, Chrome. А вы какой программой пользуетесь?