范围Javascript(范围)、范围(链式执行上下文、范围链)、活动对象(执行上下文)、动态范围(活动对象)(动态范围)、闭包(闭包)这些概念,我们应该从静态和动态分析两个方面来理解这些概念。

首先,让我们编写一个简单的函数来做一个例子:

复制代码代码如下所示:

添加函数(num1,num2){

VaR和= num1和num2;

收起回复;

}



我们定义了一个具有两个参数的Add函数。

静态方面:

当创建Add函数时,Javascript引擎创建Add函数的范围链,它指向全局上下文(全局上下文):



从上面我们可以看到,当创建Add函数时,已经创建了范围链,因此我们可以得出一个结论:函数的范围链是在函数创建时创建的,而不是动态运行周期。

动力方面:

当执行添加功能,Javascript将创建一个执行上下文(上下文),它包含了所有的附加功能运行所需要的信息。执行上下文都有它自己的作用域链,当函数运行,Javascript引擎将首先从作用域链中使用添加函数初始化的范围链的执行上下文,然后Javascript引擎将创建一个活动对象,该对象包含所有的局部变量,函数参数和操作时间等变量。

如果映像描述了Add函数的动态运行时发生了什么,可以描述如下:



从上面可以看出,执行上下文是一个动态的概念。它是在函数运行时创建的,活动对象对象也是一个动态概念,它是由执行上下文的范围链所引用的,因此,我们可以得出这样的结论:执行上下文和活动对象都是动态的概念,而执行上下文的范围链是由函数域链初始化的。

上述的功能范围和执行上下文域,下面关于动态范围的问题时说,通过在catch子句,Javascript语句try catch,eval方法,Javascript引擎会动态地改变上下文执行范围。下面是一个例子,看。

复制代码代码如下所示:

功能initui(){

用(文档){避免!

var =主体,

链接= getElementsByTagName(),

我= 0,

links.length len =;

当(i){

更新(链接{ + });

}

getElementById(去按钮)。Onclick =函数(){

开始();

};

bd.classname =活跃;

}





当initui功能实现上述,Javascript对应的动态范围将创建一个语句的作用域链执行上下文的前面,以红色的图像描述的过程,下面标记区域显示的语句的范围。



最后,让我们来看看最神秘的Javascript(Bi Bao)闭包。Bi Bao实际上是Javascript中的函数,Bi Bao是在函数的运行时创建的。下面举个例子。

复制代码代码如下所示:

功能assignevents(){

var id =xdi9592 ;

document.getelementbyid(保存按钮)。Onclick =函数(事件){

SaveDocument(ID);

};

}





当assignevents功能在执行时,将创建一个封闭,封闭将参考在id变量范围的assignevents,按照传统的程序设计语言,ID是一个变量存储在栈中,当函数执行身份后消失了,那怎么会再次引用很显然,Javascript是这里的另一种方式。现在让我们看看如何关闭Javascript实现。执行assignevents函数时,作用域链Javascript引擎将创建一个assignevents函数执行上下文的作用域链,包含活动对象执行assignevents Javascript引擎,同时也会创建一个闭包,而范围链关闭将参考对象的assignevent执行时间,如assignevents执行后,虽然范围链本身不再是活动对象的执行上下文,但关闭或参考对象assignevents活动对应的操作周期,这说明Javascript闭包的内部机制是可能的。E与下面的图像描述的assignevents函数的运行周期:



你可以从上面看到,当assignevents函数完成后,document.getelementbyid(保存按钮)。Onclick是指关闭,这样当用户点击保存按钮,它会触发关闭的执行。这里我们将讨论闭包执行的情况,正如前面提到的,Javascript中的闭包实际上是一个函数,因此闭包的执行与函数的执行是一致的。下面的图片是用来刻画的onclick事件相关的关闭。



从这里您可以看到Javascript引擎首先创建了执行上下文闭包,然后使用执行上下文的范围链闭包范围链来初始化闭包,最后将相应的对象闭包活动执行到范围的前面,这也进一步证实闭包是该函数的函数。