以下是来自 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:...未定义”等结果?
答案 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行定义。可以通过closure在goal
函数内部访问find
。它有点复杂但是为了这个例子的目的,闭包意味着当一个函数在另一个函数内部定义时,它可以访问属于父函数范围的变量。
如果你想了解更多关于闭包的信息(如果你要编写很多JavaScript代码,那将是一个好主意)checkout Closing the book on JavaScript Closures,这是关于闭包的一篇非常好的文章。我没有看过整件事,但this FAQ似乎也很好。
Stuart Langridge在2008年前端会议上发表了一篇名为 JavaScript闭包的秘密的精彩演讲:Part 1,Part 2