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

时间:2013-11-13 16:47:43

标签: 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>

1 个答案:

答案 0 :(得分:5)

当你有

var a = {};

你实际上有两件事:

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

当你这样做时:

var a = {};
var b = a;

你实际上有三件事:

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

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

在你的情况下会发生同样的事情,即使它被对象,属性和函数稍微模糊了。