当对象设置为null时,函数调用失败

时间:2010-08-27 01:40:00

标签: javascript

有人可以解释为什么这些slides的Javascript失败了吗?

var ninja = {
  yell: function(n){
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
  }
};
assert( ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either." );

var samurai = { yell: ninja.yell };
var ninja = null;

try {
  samurai.yell(4);
} catch(e){
  assert( false, "Uh, this isn't good! Where'd ninja.yell go?" );
}

4 个答案:

答案 0 :(得分:4)

递归函数调用使用yell()中的ninja引用,当你将其设置为null时,它不能再调用ninja.yell,因为ninja为null。

变化:

return n > 0 ? ninja.yell(n-1) + "a" : "hiy";

要:

return n > 0 ? this.yell(n-1) + "a" : "hiy";

它有效。

答案 1 :(得分:3)

此参考文献仍然保留:

var samurai = { yell: ninja.yell };

所以调用.yell()很好,但这个不是:

return n > 0 ? ninja.yell(n-1) + "a" : "hiy";

该调用实际上引用了ninja,现在是null,而null.yell()不是函数:)

Here's a modified version that shows the problem

答案 2 :(得分:2)

你在调用这个函数之前写了ninja = null Javascript函数通过引用捕获外部变量,因此函数内的ninja标识符引用变量的当前值。

答案 3 :(得分:1)

Samurai.yell是来自ninja的函数的“副本”。在该函数中,它引用了ninja,当Samurai.yell 执行时不再存在。