John Resig的在线JS教程#13& #14

时间:2013-12-26 16:11:10

标签: javascript

http://ejohn.org/apps/learn/#13 http://ejohn.org/apps/learn/#14

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

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." );

有人可以更好地解释这段代码吗? 我有一个Java / Scala背景,这对我来说似乎很奇怪。我想我还不知道变量和对象是如何存储在JS中的。

我不明白为什么在第一次我们不能打电话给samurai.yell(4);

1 个答案:

答案 0 :(得分:2)

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

在您未发布的示例中,已修复:

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

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