我正在阅读JavaScript忍者的 secret ,并遇到了一个编码示例:
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
var samurai = { yell: ninja.yell };
//var ninja = {};
//delete ninja;
samurai.yell(4);
如果我取消注释第二行,
samurai.yell(4)
可以正常运行,我理解它,因为samurai
仍然具有对ninja.yell
最初引用的功能的引用,该功能已被delete
删除。但是,如果我改为运行第一条注释行,则
samurai.yell(4)
将给出错误。有人可以解释幕后发生的事情吗?
我以为如果将
ninja
分配为undefined
,将创建一个新引用并将其链接到ninja
,原始引用仍然存在,并且由于samurai
仍然具有对该功能的引用,因此垃圾收集不会出现并在其中删除它记忆。 最佳答案
当你写
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
var samurai = { yell: ninja.yell };
var ninja = {};
//delete ninja;
samurai.yell(4);
var ninja = {};
将声明一个名为ninja
的变量由于重新定义了忍者,并且新对象没有与之关联的名为
samurai.yell(4);
的任何函数,因此下一行yell
将引发错误。说明:
一开始,
ninja
是var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
在这里,忍者里面有一个可以调用的
yell
函数。当您更改它的值(value)时
ninja = {};
旧值(以及函数)将被擦除并用新值覆盖。
因此,当您致电
samurai.yell(4);
转到
{ yell: ninja.yell };
,由于新的ninja
没有yell
函数,因此会引发错误