对Javascript中具有属性的函数的引用的困惑

时间:2012-03-02 01:24:29

标签: javascript reference

在以下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}}值?

2 个答案:

答案 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,所以这就是返回的内容。

用文字解释有点困难。或许图表会更容易理解吗?