首页 > 解决方案 > 这个 javascript 对象如何引用这个内联函数?

问题描述

var ninja = {
    chirp: function signal(n) {
    return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
    }
};
assert(ninja.chirp(3) == "chirp-chirp-chirp", "Works as we would expect it to!");
var samurai = { chirp: ninja.chirp };
ninja = {};
assert(samurai.chirp(3) == "chirp-chirp-chirp","The method correctly calls itself.");

将此与

var ninja = {
    chirp: function(n) {
    return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
    }
};
assert(ninja.chirp(3) == "chirp-chirp-chirp", "does not work");
var samurai = { chirp: ninja.chirp };
ninja = {};
assert(samurai.chirp(3) == "chirp-chirp-chirp","The method cannot reference function.");

对象被重新定义后如何samurai引用对象中的chirp属性?ninjaninjaninja = {};

标签: javascriptfunctionscope

解决方案


引用函数或对象的变量本质上是指向内存位置的指针。当一个变量被重新分配时,它曾经指向的内存位置的任何内容都不会改变——只是一旦脚本中的任何地方都不能再引用它,所述对象最终将被垃圾收集。

所以,ninja = {}不会改变ninja原来的对象。因为samurai有对 的引用ninja.chirp,所以该ninja.chirp函数不会被垃圾收集——或者,至少现在还没有,但samurai仍然存在。

chirporsignal函数可以调用自身,因为signal(n - 1)它是一个命名函数——它被命名signal,所以它可以通过使用它的函数名来引用和调用自身。匿名函数没有名称,因此它们不能像那样引用自己。


推荐阅读