一、作用域链
- 什么是作用域链?
我的理解就是哪些数据能够被访问,以及访问过程的某些机制;函数和对象一样,拥有可以通过代码访问的属性和仅供JavaScript引擎访问的内部属性,当函数被创建时,内部属性[[scope]]就会指向该函数的作用域链,而作用域链中储存了每个执行环境相关的变量对象。
二、 函数内部[[scope]]属性,是虚拟出来的,为了方便理解函数。下面,看一些列子:
1 | var fun1,fun2; |
fun1()运行的结果是11,fun2()运行的结果是10,因为这两个函数在同一父级作用域下,指向的是同一个作用域链;当函数fun1()执行时,变量num向上寻找值,函数fun1内部未找到,则向父级寻找获取,结果为11;函数fun2()执行时,由于和fun1()指向同一作用域链,此时num为11,执行后结果为10。
二、闭包
- 闭包的理解
上篇已经简单的介绍了变量作用域,而闭包则与变量的作用域息息相关;
闭包:能够访问其他函数内部变量的函数- 闭包的实例
1
2
3
4
5
6 function demo(){
var n = 100;
function demo1(){
alert(n);
}
}
此时,无法在外部访问demo1的内部,但是呢,我们需要在外部访问,这时该怎么办呢?
1
2
3
4
5
6
7
8
9function demo(){
var n = 100;
function demo1(){
alert(n);
}
return demo1;
}
var fn = demo();
fn();当我们把demo1作为返回值返回,这时就可以在外部访问demo1的内部了
- 闭包的注意事项
- 用途:可以在外部访问函数内部变量;这些变量的值始终保存在内存中
- 由于闭包函数中的变量始终保存在内存中,则会消耗内存,所以,不要滥用闭包,会造成网页性能问题;在IE中会存在内存泄漏,解决方法是,退出函数之前,将不需要用的变量删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。