我们在深入研究JavaScript时遇到了麻烦,请帮助我们.提前致谢
下面的代码,为什么武士仍然无法调用函数大喊
===>
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." );
Run Code Online (Sandbox Code Playgroud)
但在这些代码中它不能叫喊
===>
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?" );
}
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,yell是一个命名函数.在函数内,符号yell解析为函数,因此它可以调用自身.所以你消灭了这个ninja物体并不重要.
var ninja = {
yell: function yell(n){
// ^^^^-------------------------- the name
return n > 0 ? yell(n-1) + "a" : "hiy";
// ^^^^------------------------ using the name
}
};
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,它yell是一个匿名函数,它试图通过自身调用ninja.yell,当ninja它被清除时显然会失败.
var ninja = {
yell: function(n){
// ^-------------------------------------- no name
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
// ^^^^^^^^^^-------------------------- relies on `ninja` object
}
};
Run Code Online (Sandbox Code Playgroud)
旁注:在第一个示例中,您ninja通过为其分配一个不同的空白对象来消除该对象(ninja = {}),但在第二个示例中,您通过分配null(ninja = null)来执行此操作.无关紧要,使用空白对象或null在两个示例中都会有相同的结果(尽管第二个示例中收到的错误会发生变化).
附注2:请注意,var ninja = ...每个示例中的第二行实际上都被视为ninja = ....构造var x = y;实际上是在不同时间发生的两个完全不相关的事情:变量声明,var x在进入包含它的执行上下文(松散地,"范围")时发生; 和分配操作,x = y;当在逐步执行中到达该行代码时发生.在范围内有多个声明是无操作.更多:可怜的误会var
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |