Сегодня я столкнулся с действительно странным поведением с использованием JavaScript.Я думаю, что понял это как-то сейчас, но я хотел бы знать, происходит ли то, что, по моему мнению, происходит на самом деле или есть какая-то другая магия.Итак, это мой код:
var SomeObject = {};
SomeObject.foo = function(a, b) {
var baz = this.bar(a, b);
console.log(baz);
console.log(baz.left);
SomeObject.magicalStuff(baz);
};
SomeObject.bar = function(a, b) {
return {left: a-b, top: b-a};
};
SomeObject.magicalStuff = function(position) {
position.left = 0;
};
SomeObject.foo(100, 50);
Код в jsFiddle
Вывод это что-то вроде (в зависимости от браузера):
> Object
50
Если вы развернете «Объект» (в Chrome, Safari или Firefox (Firebug), то получите:
> Object
left: 0
top: -50
Тогда как я ожидал бы:
> Object
left: 50
top: -50
ЧтоЯ думаю, что дело в том, что console.log () на самом деле просто «публикует» ссылку на консоль, которая читается, когда вы нажимаете на символ «развернуть». Но это не значит, что это побеждает цель console.log() как инструмент отладки? Я всегда ожидал, что console.log () "сделает снимок" того, что я ему передаю. Удивительно видеть выражение, которое появляется после того, как фактическая console.log () изменила вывод этого самоговызов console.log ().
Или что-то еще происходит?
Редактировать: Мне также интересно, есть ли веская причина для разработчиков браузеровреализовать console.log, как это (я думаю, что есть один, в противном случае он не будет последовательнымчерез основные браузеры).