作用域链
作用域他是针对变量的,比如我创建了一个函数aa,函数里面有包含了一个函数bb,那么此时就存在了三个作用域。
全局作用域,和aa作用域. bb作用域,
全局作用域包含了aa的作用域,bb的作用域包含了aa的作用域
当aa在查找变量的时候会先在本身的作用域进行查找,找不到的话在到上一级bb的作用域进行查找,如果还没有呢,就向全局作用域区查找,这样就形成了一个作用域链。
闭包
理解闭包首先要理解JS的垃圾回收机制,
当一个函数执行完毕以后,作用域会被收回,如果形成闭包,执行完以后作用域不会被收回,
如果某个函数被他的父函数之外的一个变量引用的话,就会形成闭包,
闭包的作用呢,就是保存自己的私有变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量
闭包的优点
1、保护函数内的变量安全,加强了封装性
2、避免全局变量的污染
3、私有成员的存在
闭包的缺点
1、闭包有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生,而且容易造成内存泄漏。
当变量使用完以后,最好销毁变量,或者为它赋值null
特性:1:函数套函数;
1:内部函数可以直接使用外部函数的局部变量或参数
2、变量或参数不会被垃圾回收机制回收