Javascript 词法作用域/闭包和全局函数递归

Javascript 词法作用域/闭包和全局函数递归,javascript,closures,lexical-scope,Javascript,Closures,Lexical Scope,这既是一个词汇范围界定的例子,也是一个证实我自己理解的问题。首先,考虑下面的例子: Html: 当我第一次运行这个示例时,我担心fnTest会有一个全局闭包,因此currentIdx和endIdx会被fnTest的两个调用设置和访问。但事实并非如此 请让我知道以下是否是一个很好的解释方法: 对fnTest的每次调用都会创建一个唯一的对象,在该对象中,变量currentIdx和endIdx在该调用的生命周期内以及该调用中的所有子例程(这称为闭包)都存储在该对象中。setTimeout调用从匿名函数

这既是一个词汇范围界定的例子,也是一个证实我自己理解的问题。首先,考虑下面的例子:

Html:

当我第一次运行这个示例时,我担心fnTest会有一个全局闭包,因此currentIdx和endIdx会被fnTest的两个调用设置和访问。但事实并非如此

请让我知道以下是否是一个很好的解释方法:

对fnTest的每次调用都会创建一个唯一的对象,在该对象中,变量currentIdx和endIdx在该调用的生命周期内以及该调用中的所有子例程(这称为闭包)都存储在该对象中。setTimeout调用从匿名函数创建一个新对象,匿名函数可以访问fnTest闭包,因此可以引用currentIdx和endIdx,此对象/函数将在100毫秒延迟后执行。在执行时,匿名函数本身将通过调用fnTest创建一个新的fnTest闭包。此时,匿名函数引用的原始fnTest闭包可能会被丢弃


请在必要时更正我的技术术语。

基本正确,有几点:

每次调用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