作用域链和闭包的理解

一、作用域链

  • 什么是作用域链?
    我的理解就是哪些数据能够被访问,以及访问过程的某些机制;函数和对象一样,拥有可以通过代码访问的属性和仅供JavaScript引擎访问的内部属性,当函数被创建时,内部属性[[scope]]就会指向该函数的作用域链,而作用域链中储存了每个执行环境相关的变量对象。

二、 函数内部[[scope]]属性,是虚拟出来的,为了方便理解函数。下面,看一些列子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var fun1,fun2;
function fun(){
var num = 10;
fun1 = function (){
console.log(++num);
}
console.log(num);
fun2 = function (){
console.log(--num);
}
}
fun();//10
fun1();//11
fun2();//10

  fun1()运行的结果是11,fun2()运行的结果是10,因为这两个函数在同一父级作用域下,指向的是同一个作用域链;当函数fun1()执行时,变量num向上寻找值,函数fun1内部未找到,则向父级寻找获取,结果为11;函数fun2()执行时,由于和fun1()指向同一作用域链,此时num为11,执行后结果为10。

二、闭包

  1. 闭包的理解
    上篇已经简单的介绍了变量作用域,而闭包则与变量的作用域息息相关;
    闭包:能够访问其他函数内部变量的函数
  2. 闭包的实例
    1
    2
    3
    4
    5
    6
    function demo(){
    var n = 100;
    function demo1(){
    alert(n);
    }
    }
  • 此时,无法在外部访问demo1的内部,但是呢,我们需要在外部访问,这时该怎么办呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function demo(){
    var n = 100;
    function demo1(){
    alert(n);
    }
    return demo1;
    }
    var fn = demo();
    fn();
  • 当我们把demo1作为返回值返回,这时就可以在外部访问demo1的内部了

  • 闭包的注意事项
    • 用途:可以在外部访问函数内部变量;这些变量的值始终保存在内存中
    • 由于闭包函数中的变量始终保存在内存中,则会消耗内存,所以,不要滥用闭包,会造成网页性能问题;在IE中会存在内存泄漏,解决方法是,退出函数之前,将不需要用的变量删除。
    • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值