Javascript范围链的使用介绍

一篇文章写的Javascript闭包的理解是什么关闭之前,想写清楚并能理解闭包的简单的原因,但表示在作用域链和活动对象的意见,真的可以理解的关闭,在第一时间与公司不以为然,和同事发现该域执行环境是非常重要的,但也很基础,了解Javascript闭包很有用,所以写文章的范围的理解和执行环境。

行动范围

范围是变量和函数的访问范围,它控制变量和函数的可见性和生命周期。在Javascript中,变量的范围具有全局作用域和局部作用域。

Javascript范围简单或者很好理解的,以C语言编程的一些类括号中的每一段代码都有自己的适用范围,但它们在代码段声明的变量是不可见的,称为范围的块级Javascript初学者容易误解的地方,Javascript没有阻止和范围,只有函数级的范围:在一份声明中的函数及其子函数的变量是可见的。

当变量不在函数语句或语句不功是一个全局变量,在全球范围内,该窗口对象的所有的属性有一个全球范围;在任何地方都可以访问的代码,里面的函数声明和变量修改变量局部变量只能用在身体的功能,虽然有没有函数参数VaR的使用却仍然是一个局部变量。

复制代码代码如下所示:
var = 3;全局变量
函数FN(b){本地变量
c = 2;全局变量
var = 5;本地变量
函数功能(){
可见函数上的局部变量
对于(var i = 0;i < 3;i + +){
console.write(我);
}
警报(i);3,在for循环中声明外部函数仍然可见且没有阻塞范围。
}
}
警报(c);在函数语句中,但没有var修改,仍然是全局变量。


只要Javascript没有块范围的理解,Javascript简单的范围是很好理解的,还是有一点困惑的地方是方便初学者Javascript变量可以功能提前与分析或陈述,但很多人说是一回事,尽管Javascript是解释型的,但它是无法解释的通过按部就班的解释才真正落实,解释器将预Javascript解析代码,变量和函数的声明部分提前解释,这意味着我们可以在函数声明的函数调用,人们习惯了大多数,但对于变量和分析会很奇怪在第一一瞥
复制代码代码如下所示:
console.log(一); / /未定义
var a=3;
console.log(一); / / 3
console.log(B); / /捕获的referenceerror:B不确定

上述代码在var a = 3之前执行;语句部分已预解析(但不是赋值语句的执行),因此第一次将未定义错误,赋值语句执行后将为3,上一代码删除最后一句,下面的代码则是相同的结果。
复制代码代码如下所示:
VaR;
console.log(一); / /未定义
a = 3;
console.log(一); / / 3


然而
如果是这样的话,Javascript的范围问题是简单的,然而,由于函数的子函数的问题,活动的范围不仅是如此简单。大男人执行环境或运行环境(良好的土鳖(执行上下文):执行环境)定义的其他数据变量或函数访问,确定各自的行为。每个执行环境都有一个相关的变量对象(可变对象,VO)。在执行环境中定义的所有变量和函数都将存储在这个对象中。解析器在处理数据时将访问内部对象。

全局执行环境是最外部的执行环境。在Web浏览器中,全局执行环境的窗口对象,所以所有的全局变量和函数创建窗口对象属性和放大。每个函数都有自己的执行环境,当执行流进入一个函数,函数的环境将被推到一个函数堆栈,堆栈和执行环境和销毁在函数执行完毕后,造成破坏保存所有的变量和函数定义在控制在执行环境恢复到以前的权利,在应用程序执行环境的整体出口(浏览器关闭)会被摧毁。

作用域链

当代码在一个环境中执行时,它创建一个范围链(不称为SC),以确保有秩序地访问能够访问执行环境的变量和函数。作用域的第一个对象始终是当前执行代码环境的变量对象(VO)。

复制代码代码如下所示:
函数A(x,y){
var;
返回B;
}


当函数A被创建时,它的范围链被填充到全局对象中,而全局对象拥有所有的全局变量。





如果执行环境是一个函数,激活对象(AO)是范围链的第一个对象,第二个对象是包含的环境,下一个对象是包含环境的包含环境。
复制代码代码如下所示:
函数A(x,y){
var;
返回B;
}
无功总=一个(5,10);

无功总=一个(5,10)此时;声明的行为链如下




在函数操作过程中,标识符的解析是在范围链上搜索第一级和一级的过程。它从第一个对象开始,向后向后开始。在找到同一名称标识符之前,我们不会继续遍历它,直到找到它,如果我们找不到它,我们就不会报告它。

再看看闭包

以前的博客曾经认为只要有调用内部函数的可能性,Javascript需要保留引用的功能。此外,Javascript运行时需要跟踪所有的变量引用的内部函数,直到最后变陈旧,和Javascript的垃圾收集器可以释放相应的存储空间。回头看,我们可以了解很多。用母函数定义的变量不能在子函数的作用域链被破坏,所有的变量和函数的作用域链将保持不被破坏。

复制代码代码如下所示:
对于(var i = 0;i < elements.length;i++){
元素{我}。onclick =函数(){
警报(一);
}
}

这是第一个博客中提到的经典错误。每次元素单击警报时,都是长度。在这个代码中,元素绑定单击事件处理程序的作用域链如下所示。



由于内部函数(Click事件处理程序被调用,所以时间可能)作用域链不能被破坏(更不用说,在我的情况下在全球范围内,只有页面被破坏,卸载我的长度值)实施后周期仍然存在,所以我会报警长度触发每一次。

复制代码代码如下所示:
对于(var i = 0;i < elements.length;i++){
(函数(n){)
元素{ }。onclick =函数(){
警报(N);
}
})(一);
}


我们为什么要这样做当时,变量的onclick成为引用,和每一个onclick功能保持相应的N(0 ~ length-1)在作用域链由于执行功能立即的原因。这次可以了。

最后

事实上,了解执行环境和作用域链关闭后,变成了一些很明显的,但也不要滥用封闭,从上面的例子可以看出,子函数闭包将保持其作用域链中所有的变量和函数和内存,内存消耗,试图摧毁母函数不再在使用变量时使用。