http://ejohn.org/apps/learn/#13 http://ejohn.org/apps/learn/#14
在#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: ninja.yell };
var ninja = null;
try {
samurai.yell(4);
} catch(e){
assert( false, "Uh, this isn't good! Where'd ninja.yell go?" );
}
VS
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." );
有人可以更好地解释这段代码吗? 我有一个Java / Scala背景,这对我来说似乎很奇怪。我想我还不知道变量和对象是如何存储在JS中的。
我不明白为什么在第一次我们不能打电话给samurai.yell(4);
答案 0 :(得分:2)
您发布的代码存在的问题是“yell”函数要求外部作用域变量“ninja”保留对该对象的引用。如果它被更改(如您的示例中所示;它设置为null
),则该函数不起作用。
在您未发布的示例中,已修复:
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
该函数在function
关键字后面使用名称(“yell”)进行实例化。该名称将在函数内部作为对自身的引用,因此不再依赖变量“ninja”。