私は今日、javascriptでいくつかの本当に奇妙な動作に遭遇しました。私はそれが何とか今考え出されたと思うが、私が思っていることが本当に起こっているのか、他の魔法が関わっているのか知りたい。なぜconsole.log()は渡された変数のスナップショットを取得しませんか?
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);
これの出力は(ブラウザによって異なります)のようなものです::だからこれは私のコードである
> 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を実装するのに妥当な理由があるのだろうか(私はそこにあると思います。そうでなければ、主要なブラウザ間で一貫性がないでしょう)。
https://bugs.webkit.org/show_bug.cgi?id=35801を参照してください。 –
@Roatin Marth:わかります。しかし、なぜ彼らは言う: "我々はオブジェクトをコンソールにダンプするときにオブジェクトを複製することはできません"。私が見ることができない技術的な問題は何ですか? :) – fresskoma
これは、すべてのイベントが単一のオブジェクトであるため、通常は最新のmousemoveイベントを見ているため、イベントをログに記録するときによく見られます。 –