Moh*_*han 1 javascript function
PROGRAM1
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 }; //ninja.yell already assigned before ninja=null
var ninja = null;
try {
samurai.yell(4); ///WHy this statement not execting??????????
} catch(e){
assert( false, "Uh, this isn't good! Where'd ninja.yell go?" );
Run Code Online (Sandbox Code Playgroud)
程序2
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 }; ////ninja.yell already assigned before ninja={}
var ninja = {}; //
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );//why this is working while the above code is working
Run Code Online (Sandbox Code Playgroud)
正如你可以通过这两个几乎相同的例子看到的(根据我的有限知识),第二个是执行而第一个不是.我在上面的代码片段中的注释中添加了我的问题描述.
至关重点,我的问题是,在Program1 samurai.yell(4)中没有执行.但是,在Program2中samurai.yell(4)正在执行.两者几乎相同,但为什么第二次执行时第一次没有?
这有没有关系之间的区别null和{},这仅取决于如何ninja.yell定义函数.
第一个示例不起作用,因为在ninja.yell函数内部,您ninja再次引用:
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
Run Code Online (Sandbox Code Playgroud)
所以,如果以后你要分配null到ninja,这段代码将抛出一个错误,因为null没有一个属性yell.
第二个例子的作品,因为这是你的什么没有做的事情.您不是引用包含function(ninja)的对象,而是为函数指定名称并直接引用该名称:
function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
Run Code Online (Sandbox Code Playgroud)
该函数基本上是"自包含"的,它不依赖于自由变量的值.