javascript - 将对象分配给 undefined 和 delete 之间的区别

标签 javascript javascript-objects

我在阅读 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/

相关文章:

javascript - 在 EmberJS 模板上使用 DataTables

javascript - Redux 深度复制数组,即使它们保持不变?

javascript - 尝试将过滤器应用于充满对象的嵌套数组

嵌套在数组中的 Javascript 对象

javascript - 如果您知 Prop 体位置,则从嵌套数组中删除对象,javascript

JavaScript 两个对象 - 相互覆盖

javascript - 如何在具有对象的 React 应用程序中循环遍历 javascript 数组并获取具有特定值的属性的计数

javascript - 为什么直接在 function 上添加方法不能像 function.prototype 那样工作?

javascript - 在 foreach Javascript 中找到最大的数值?

javascript - 如何在具有正则表达式模式的匹配方法中使用变量