Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 约翰·雷西格';s在线JS教程#13&#14_Javascript - Fatal编程技术网

Javascript 约翰·雷西格';s在线JS教程#13&#14

Javascript 约翰·雷西格';s在线JS教程#13&#14,javascript,Javascript,在#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:

在#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

有人能更好地解释这个代码吗? 我有Java/Scala的背景,这对我来说真的很奇怪。我想我还不明白变量和对象是如何存储在JS中的


我不明白为什么一开始我们不能叫武士

您发布的代码的问题是“yell”函数要求外部范围变量“ninja”保留对对象的引用。如果它被更改(如您的示例中所示;它被设置为
null
),则该函数不起作用

在您未发布的示例中,它是固定的:

var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
}; 

函数在
函数
关键字后用名称(“yell”)实例化。该名称将在函数内部作为对自身的引用,因此不再依赖变量“ninja”。

能否编辑您的问题,使其更具体一些?“有人能解释一下这段代码吗”很模糊,如果这个问题是独立的,而不需要阅读外部链接,那就更好了。我已经编辑了,让它更清楚了,但很明显,我不理解的部分是最后断言的行:)哦,好吧,我没有看到它是使用
ninja.yell(n-1)递归调用的
。所以第一次调用可以找到yell方法,但是一旦在方法中,它就再也找不到yell方法了,对吗?我认为这一例外是因为第一次叫喊会很奇怪,是的,第一次叫喊中嵌入了对“忍者”的引用才是问题所在。它使代码处于脆弱状态。在第二个(#14)版本中,函数中的符号“yell”总是指函数。
var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
};