我们在深入研究 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
is a named功能。在函数内,符号yell
解析为函数,因此它能够调用自身。所以你已经消灭了并不重要ninja
object.
var ninja = {
yell: function yell(n){
// ^^^^-------------------------- the name
return n > 0 ? yell(n-1) + "a" : "hiy";
// ^^^^------------------------ using the name
}
};
在第二个例子中,yell
is an 匿名的函数并尝试通过调用自身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;
,当逐步执行到该行代码时就会发生这种情况。在一个作用域内有多个声明是无操作的。更多的:可怜的误解var http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)