javascript - 为什么对匿名函数的引用继续存在?

标签 javascript

Samurai 依赖于 ninja.chirp,但我删除了对 ninja.chirp 的引用。为什么这段代码继续有效?

    var ninja = {
        chirp: function (n) {
            return n > 1 ? this.chirp(n - 1) + '-chirp' : 'chirp'; 
        }
    };

    function chirp(n) {
        return n > 1 ? chirp(n-1) + '-chirp' : 'chirp'; 
    }

    var samurai = {
        chirp: ninja.chirp
    };

    ninja = {};
    try {
        console.log(samurai.chirp(3));
    }
    catch (e) {
        console.log("no can do.");
    }
</script>

最佳答案

当你有

var a = {};

你实际上有两件事:

  • 内存中存在的没有属性的对象
  • 对存储在变量a中的对象的引用

当你这样做时:

var a = {};
var b = a;

你实际上拥有三件事:

  • 内存中存在的没有属性的对象
  • 对存储在变量a中的对象的引用
  • 存储在变量 b 中的对该对象的另一个引用

这就是为什么当您稍后执行 a = null; 时,b 仍然保留对原始对象的引用。

同样的事情也发生在你的例子中,尽管它被对象、属性和函数稍微掩盖了一些。

关于javascript - 为什么对匿名函数的引用继续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19959582/

相关文章:

javascript - Google Auth 用户电子邮件不存在

javascript - ng-change 不起作用,ng-change 后未加载数据

javascript - d3.js 重新排列绘图的数据列

javascript - 图片加载时间

javascript - react /mobX : best practice

javascript - Chrome 扩展程序的内容脚本如何确定注入(inject)页面的引荐来源网址?

javascript - JS 获取动画元素的当前位置

javascript - Mirror.js中的矩阵运算(三个js)

javascript - 谷歌热图包括点数

javascript - 在 AngularJS 中更改路线时如何防止 View 重绘