gpt4 book ai didi

javascript - 在 JavaScript 中分配内存

转载 作者:行者123 更新时间:2023-11-30 07:40:11 24 4
gpt4 key购买 nike

我们在深入研究 JavaScript 时遇到了麻烦,请帮助我们。提前致谢

下面的代码,为什么 samurai 仍然不能调用函数 yell

===>
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
assert( ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!" );

var samurai = { yell: ninja.yell };
var ninja = {};
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );

但是在这些代码中它不能调用 yell

===>
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
assert( ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either." );

var samurai = { yell: ninja.yell };
var ninja = null;

try {
samurai.yell(4);
} catch(e){
assert( false, "Uh, this isn't good! Where'd ninja.yell go?" );
}

最佳答案

在第一个示例中,yell 是一个命名 函数。在函数内,符号 yell 解析为函数,因此它能够调用自身。因此,您已经清除了 ninja 对象并不重要。

var ninja = { 
yell: function yell(n){
// ^^^^-------------------------- the name
return n > 0 ? yell(n-1) + "a" : "hiy";
// ^^^^------------------------ using the name
}
};

在第二个示例中,yell 是一个匿名 函数,它试图通过ninja.yell 调用自身,当ninja 已被消灭。

var ninja = { 
yell: function(n){
// ^-------------------------------------- no name
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
// ^^^^^^^^^^-------------------------- relies on `ninja` object
}
};

旁注:在您的第一个示例中,您通过为 ninja 对象分配一个不同的空白对象 (ninja = {}) 来清除它,但是在第二个示例是通过分配 null (ninja = null) 来实现的。没关系,使用空白对象或 null 在两个示例中会产生相同的结果(尽管您在第二个示例中收到的错误会发生变化)。


旁注 #2:请注意,每个示例中的第二行 var ninja = ... 实际上被视为 ninja = ...。构造 var x = y; 实际上是在不同时间发生的两个完全不相关的事情:变量声明 var x,它发生在进入执行上下文时(松散地,“范围”)包含它;和一个赋值操作,x = y;,当逐步执行到该行代码时发生。在一个范围内有多个声明是空操作。更多:Poor misunderstood var

关于javascript - 在 JavaScript 中分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19588672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com