Javascript 词法作用域/闭包和全局函数递归
这既是一个词汇范围界定的例子,也是一个证实我自己理解的问题。首先,考虑下面的例子: Html: 当我第一次运行这个示例时,我担心fnTest会有一个全局闭包,因此currentIdx和endIdx会被fnTest的两个调用设置和访问。但事实并非如此 请让我知道以下是否是一个很好的解释方法: 对fnTest的每次调用都会创建一个唯一的对象,在该对象中,变量currentIdx和endIdx在该调用的生命周期内以及该调用中的所有子例程(这称为闭包)都存储在该对象中。setTimeout调用从匿名函数创建一个新对象,匿名函数可以访问fnTest闭包,因此可以引用currentIdx和endIdx,此对象/函数将在100毫秒延迟后执行。在执行时,匿名函数本身将通过调用fnTest创建一个新的fnTest闭包。此时,匿名函数引用的原始fnTest闭包可能会被丢弃Javascript 词法作用域/闭包和全局函数递归,javascript,closures,lexical-scope,Javascript,Closures,Lexical Scope,这既是一个词汇范围界定的例子,也是一个证实我自己理解的问题。首先,考虑下面的例子: Html: 当我第一次运行这个示例时,我担心fnTest会有一个全局闭包,因此currentIdx和endIdx会被fnTest的两个调用设置和访问。但事实并非如此 请让我知道以下是否是一个很好的解释方法: 对fnTest的每次调用都会创建一个唯一的对象,在该对象中,变量currentIdx和endIdx在该调用的生命周期内以及该调用中的所有子例程(这称为闭包)都存储在该对象中。setTimeout调用从匿名函数
请在必要时更正我的技术术语。基本正确,有几点: 每次调用fnTest都会创建一个唯一的对象,在该对象中,变量currentIdx和endIdx将在该调用的生命周期内存储在该对象中 在这个物体的生命周期内,正如费利克斯所说,它被称为环境。该生命周期与所有其他对象的生命周期相同:只要某个对象仍有对它的引用。特别是,在返回
fnTest
后,它将继续(在本例中)
唯一可以引用这些环境对象的是在它们内部创建的函数,这些函数称为闭包(它们“关闭”环境)
…以及该调用中的所有子例程(这称为闭包)
这些函数称为闭包,而不是环境
setTimeout调用从匿名函数创建一个新对象
否,您的代码正在创建一个匿名函数,并将对该函数的引用传递到setTimeout
中
…可以访问fnTest闭包,因此可以引用currentIdx和endIdx
它可以访问创建它的环境
此对象/函数将在100毫秒延迟后执行。在执行时,匿名函数本身将通过调用fnTest创建一个新的fnTest闭包
它通过调用fnTest
,yes来创建一个新环境
此时,匿名函数引用的原始fnTest闭包可能会被丢弃
由于计时器机制已释放了对匿名函数的引用,因此不再有任何内容引用匿名函数,并且可以对其进行垃圾收集。由于它是从最初调用fnTest
时引用环境的唯一对象,因此该环境也可以被垃圾收集
我们在上面的细节中做了一些手摇,但是重要的概念是存在的并且是正确的。基本上,“每次调用fnTest都会创建一个唯一的对象,其中存储变量currentIdx和endIdx”。这个“对象”称为环境。无论何时调用函数,都会创建一个新环境。
<div id="testtxt"></div>
function fnTest(currentIdx, endIdx) {
$('#testtxt').html($('#testtxt').html() + 'Function Called ' + currentIdx + '<br />');
if (currentIdx < endIdx) {
setTimeout(function(){
fnTest(currentIdx + 1, endIdx);
}, 100);
}
}
fnTest(1, 10);
fnTest(11, 20);
Function Called 1
Function Called 11
Function Called 2
Function Called 12
Function Called 3
Function Called 13
Function Called 4
Function Called 14
Function Called 5
Function Called 15
Function Called 6
Function Called 16
Function Called 7
Function Called 17
Function Called 8
Function Called 18
Function Called 9
Function Called 19
Function Called 10
Function Called 20