javascript中的对象null和{}行为

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)正在执行.两者几乎相同,但为什么第二次执行时第一次没有?

Fel*_*ing 7

这有没有关系之间的区别null{},这仅取决于如何ninja.yell定义函数.

第一个示例不起作用,因为在ninja.yell函数内部,您ninja再次引用:

return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
Run Code Online (Sandbox Code Playgroud)

所以,如果以后你要分配nullninja,这段代码将抛出一个错误,因为null没有一个属性yell.


第二个例子的作品,因为这是你的什么没有做的事情.您不是引用包含function(ninja)的对象,而是为函数指定名称并直接引用该名称:

function yell(n){ 
   return n > 0 ? yell(n-1) + "a" : "hiy"; 
} 
Run Code Online (Sandbox Code Playgroud)

该函数基本上是"自包含"的,它不依赖于自由变量的值.

  • @MohammadFaizankhan:看到我刚刚添加的第一句话.当然,一般情况有所不同:`null`是`null`,`{}`是一个对象.但这并不是第一个例子失败的原因.如果你指定了`ninja = {}`,它也会失败. (2认同)