我在阅读 Secrets of the JavaScript Ninja 时遇到了一个编码示例:
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);
将抛出一个错误,因为 ninja 已被重新定义并且新对象没有任何名为 yell
的函数关联与它。
解释:
一开始,忍者
是
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
这里ninja里面有一个函数yell
可以调用。
当你将它的值更改为
ninja = {};
旧值(连同函数)被删除并被新值覆盖。
因此,当你调用
samurai.yell(4);
它转到 { yell: ninja.yell };
因为新的 ninja
没有 yell
函数,它抛出一个错误
关于javascript - 将对象分配给 undefined 和 delete 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40907587/