作用域:
1.js采取静态作用域,也成词法作用域,也就是说作用域在定义的时候就创建了,而不是在运行的时候
2.定义:变量和函数能被有效访问的区域或集合
3.作用域就是一个杜丽丽的空间,用于保护变量防止泄露,也起到到隔离的作用
4.作用域分为全局作用域、函数作用域、块级作用域
全局作用域:
1.函数内外均可访问
局部作用域:
1.只能在函数内部访问
2.需要注意如果在函数内部使用必须var或let声明,要不是调用的是全局变量
3.函数内容定义变量和函数全局变量同名,会覆盖
块级作用域:
es6提出,let、const
函数也是块级作用域
作用域链:
1.表示一个作用域可以访问到变量的集合,函数作为一个对象有一个[[scope]]属性,来表示这个集合
2.活动变量(AO)、变量对象(VO)、执行上下文
============================================
1.当前所在上下文寻找所需变量,如果没有,会去其父级上下文寻找,直到window,如果还没有找到会报错
2.内部环境可以通过作用域链来访问外部环境的属性方法,但是外部环境不能访问函数内部的属性和方法,只能通过定义函数来延长作用域链条
3.执行函数,每个函数运行时都会产生一个执行环境,js为每一个执行环境关联了一个变量对象,环境中所有定义的变量和函数都保存在这个对象中
4.js执行顺序是根据调用函数决定的,当一个函数被调用时,该函数环境的变量对象会被压缩到一个环境栈中,函数执行后,站将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象
闭包:
1.函数里面套函数,内部函数调用外部函数的变量
2.优点:不会造成变量污染,可重复使用
3.缺点:使用闭包后的变量是保存在内存中,造成性能损耗
4.解决方案:退出函数前,将不使用得当局部变量全部删除