javascript - 这个 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
属性?ninja
ninja
ninja = {};
解决方案
引用函数或对象的变量本质上是指向内存位置的指针。当一个变量被重新分配时,它曾经指向的内存位置的任何内容都不会改变——只是一旦脚本中的任何地方都不能再引用它,所述对象最终将被垃圾收集。
所以,ninja = {}
不会改变ninja
原来的对象。因为samurai
有对 的引用ninja.chirp
,所以该ninja.chirp
函数不会被垃圾收集——或者,至少现在还没有,但samurai
仍然存在。
chirp
orsignal
函数可以调用自身,因为signal(n - 1)
它是一个命名函数——它被命名signal
,所以它可以通过使用它的函数名来引用和调用自身。匿名函数没有名称,因此它们不能像那样引用自己。
推荐阅读
- java - 我怎样才能在课程之间进行更改?
- sql - 即使将定义器设置为解决初始错误,MySQL 错误 1449 仍然出现?
- php - 使用与 php mvc 嵌套的选择时出现 ajax 问题
- snowflake-cloud-data-platform - 雪花视图的性能问题
- python - 硒自动化可以与 BS4 一起使用吗?
- javascript - 如何使用以“;”分隔的 Jquery 或 javascript 添加多个电子邮件 ID 验证 “,”在文本区域
- opentok - 在 Iframe 中运行调用前测试演示
- python - 从 Django 的根目录提供静态文件
- tfs - Visual Studio tfs 多服务器添加问题
- haskell - 独立的 Haskell 可执行文件可以在具有相同操作系统的机器上运行吗?