Javascript 约翰·雷西格';s在线JS教程#13&#14
在#13,以我的Java背景,我真的不明白发生了什么,以及为什么#14是解决问题的解决方案Javascript 约翰·雷西格';s在线JS教程#13&#14,javascript,Javascript,在#13,以我的Java背景,我真的不明白发生了什么,以及为什么#14是解决问题的解决方案 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:
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?" );
}
VS
有人能更好地解释这个代码吗?
我有Java/Scala的背景,这对我来说真的很奇怪。我想我还不明白变量和对象是如何存储在JS中的
我不明白为什么一开始我们不能叫武士代码>您发布的代码的问题是“yell”函数要求外部范围变量“ninja”保留对对象的引用。如果它被更改(如您的示例中所示;它被设置为
null
),则该函数不起作用
在您未发布的示例中,它是固定的:
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
函数在
函数
关键字后用名称(“yell”)实例化。该名称将在函数内部作为对自身的引用,因此不再依赖变量“ninja”。能否编辑您的问题,使其更具体一些?“有人能解释一下这段代码吗”很模糊,如果这个问题是独立的,而不需要阅读外部链接,那就更好了。我已经编辑了,让它更清楚了,但很明显,我不理解的部分是最后断言的行:)哦,好吧,我没有看到它是使用ninja.yell(n-1)递归调用的
。所以第一次调用可以找到yell方法,但是一旦在方法中,它就再也找不到yell方法了,对吗?我认为这一例外是因为第一次叫喊会很奇怪,是的,第一次叫喊中嵌入了对“忍者”的引用才是问题所在。它使代码处于脆弱状态。在第二个(#14)版本中,函数中的符号“yell”总是指函数。
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};