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" (!!!)
foo has attributes : value 1 and undefined
のみが変更されているため、明らかに取得することを期待しbar
ています...しかし、スクリプトは実際には両方bar
を変更し、foo
私を大いに混乱させます。
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.js の両方) で同じ結果が得られました。
私がやりたいことはもちろん、foo に影響を与えずに最初の例から bar を変更することです。どんな助けでも大歓迎です。