一.概述
1.JavaScript作用域:就是代码名字(变量)在某个范围内起作用和效果
2.作用域目的是提高程序可靠性,减少命名冲突
二.作用域
1.分类:全局作用域和局部作用域
2.全局作用域:整个script标签或者一个单独的js文件
3.局部作用域(函数作用域):在函数内部就是局部作用域
- 函数作用域会在调用函数时创建
- 每调用一次就会创建一个新的作用域,他们之间相互独立
- 在函数作用域中可以访问全局作用域的变量;而在全局作用域内无法访问函数作用域内的变量
三.变量的作用域
1.分类:全局变量和局部变量
2.全局变量:在全局作用域下的变量
(1)在函数内部没有声明,而是直接赋值的变量也是全局变量3.局部变量:在局部作用域下的变量
(1)函数的形参也是局部变量4.区别(在执行效率上看):
(1)全局变量再关闭浏览器时销毁,比较占内存;局部变量在程序执行完毕就会销毁,比较节约内存5.es6新增块级作用域:就是{}里
(1)js中没有块级作用域,是在es6中新增的四.作用域链
1.只要是代码,就至少有一个作用域
2.函数内加一个函数,就是多了一个作用域
3.内部函数访问外部函数的变量,采取链式查找来决定取哪个值,这种结构称为作用域链
4.作用域链采取就近原则 上级有该变量就用该变量 若没有就在往上一级
五.预解析
1.js代码由浏览器中的JavaScript解析器来执行,JavaScript解析器运行代码时会分以下两步:
(1)预解析:js引擎会把js里所有的var和function提升到当前作用域的最前面
(2)代码执行:按照代码的书写顺序从上到下执行2.预解析:
(1)变量预解析(变量提升):就是把所有的变量声明提升到当前作用域的最前面(不提升赋值)
(2)函数预解析(函数提升):就是把所有的函数声明提升到当前作用域的最前面(不提升调用)