我正在阅读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函数,因此会引发错误

07-24 09:46