在以下javascript代码中:
function foo() {
foo.val = foo.val || 'no val';
return 'foo has ' + foo.val;
};
function bar() {
bar.val = bar.val || 'no val';
return 'bar has ' + bar.val;
};
var a = foo;
foo.val = '1';
bar.val = '2';
a.val = '3';
foo = bar;
'foo says "' + foo() + '", bar says "' + bar() + '", a says "' + a() +'"';
我期望的是:
foo说“酒吧有2”,酒吧说“酒吧有2”,一个说“foo有3”
但是,当从Firefox 10.0.2中的Firebug控制台运行时,我得到:
foo说“酒吧有2”,酒吧说“酒吧有2”,有人说“foo有2”
任何人都可以向我解释幕后发生的事件顺序吗?为什么a
与原foo
函数保持一致(正如我所料),但保留bar
的{{1}}值?
答案 0 :(得分:4)
当foo()
函数通过a()
调用执行时,其代码表示获取foo.val
的值,即val
属性foo
在那一刻指的是。所以你的a()
函数实际上看起来像这样:
function a() {
foo.val = foo.val || 'no val';
return 'foo has ' + foo.val;
};
但此时foo
只是对bar
的引用。
答案 1 :(得分:4)
在这行代码之后:
var a = foo;
a
指向foo
指向的相同功能。在
foo = bar;
您重新分配foo
以指向bar
所指的任何内容。这不会更新a
的引用 - 它仍然指向foo
最初指向的函数。
现在,当您运行a()
时,将执行原始函数。它抓取foo
(现在指向bar
的引用)并获取其val
属性。 <{1}}的{{1}}对象是2,所以这就是返回的内容。
用文字解释有点困难。或许图表会更容易理解吗?