JavaScript中未定义的变量

时间:2011-11-15 05:09:52

标签: javascript

以下是来自 Eloquent JavaScript 的JavaScript示例:

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

在开始时,第3行中的“开始”和“目标”未定义。为什么代码不会立即返回“undefined”或“ReferenceError:...未定义”等结果?

3 个答案:

答案 0 :(得分:1)

第3行只是函数定义的一部分。它没有被执行。倒数第二行是开始执行的那一行。调用时,将值1和“1”分配给参数start和history。目标是引用外部函数的参数。调用外部函数时会填充此内容。

答案 1 :(得分:0)

start和goal是第1行和第2行中find和findSequence函数的参数

答案 2 :(得分:0)

它们不会导致错误,因为第3行它们都被定义了。在JavaScript中,函数参数被隐式定义为该函数内部的局部变量。这就是为什么start被定义并使用在调用find时作为第一个参数传递的值进行初始化的原因。同样,goal在创建function函数的findSequence语句中的第1行定义。可以通过closuregoal函数内部访问find。它有点复杂但是为了这个例子的目的,闭包意味着当一个函数在另一个函数内部定义时,它可以访问属于父函数范围的变量。

如果你想了解更多关于闭包的信息(如果你要编写很多JavaScript代码,那将是一个好主意)checkout Closing the book on JavaScript Closures,这是关于闭包的一篇非常好的文章。我没有看过整件事,但this FAQ似乎也很好。

Stuart Langridge在2008年前端会议上发表了一篇名为 JavaScript闭包的秘密的精彩演讲:Part 1Part 2