有人可以解释为什么这些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?" );
}
答案 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()
不是函数:)
答案 2 :(得分:2)
你在调用这个函数之前写了ninja = null
Javascript函数通过引用捕获外部变量,因此函数内的ninja
标识符引用变量的当前值。
答案 3 :(得分:1)
Samurai.yell
是来自ninja
的函数的“副本”。在该函数中,它引用了ninja
,当Samurai.yell
执行时不再存在。