私は、javascriptクロージャー内で非常に奇妙な動作に遭遇しました。クロージャのグローバル変数がオブジェクトである場合、その変数から別の変数への代入は何らかのポインタのように動作します。簡単なコードは、私が何を意味するか、より良い説明する必要があります:クロージャー内のオブジェクトへの割り当ては、ポインタのように振る舞います
function closure() {
var foo = {key1 : 'value 1'};
return {
method: function(){
var bar = foo;
bar.key2 = 'value2';
return 'foo has attributes : ' + foo.key1 + ' and ' + foo.key2
}
}
}
var someVar = closure();
someVar.method(); // returns "foo has attributes : value 1 and value2" (!!!)
私は明らかとしてのみbar
が変更されました...しかし、スクリプトが実際に両方bar
とfoo
を変更する私をたくさん混乱foo has attributes : value 1 and undefined
を得ることが期待されます。
私もfoo
とbar
は、文字列や数値であるとき、すべてが期待どおりに動作することに気づいた - bar
を変更することはfoo
には影響しません。
function closure() {
var foo = 10;
return {
method: function(){
var bar = foo;
bar += 1;
return 'foo is : ' + foo + ' and bar is ' + bar
}
}
}
var someVar = closure();
someVar.method(); // returns "foo is : 10 and bar is 11"
私はこの行動の理由...運を把握しようと、全夜を過ごしました。 SpiderMonkeyとV8(Chromeとnode.jの両方)と同じ結果が得られました。
私がしたいことはもちろん、fooに影響を与えずに最初の例からbarを修正することです。どんな助けも非常に高く評価されます。
この予想される動作は、実際にはクロージャとは関係ありません。あなたの説明のために – dlaliberte