什么是作用域
- 变量作用的范围
js里面有几种作用域
- 全局作用域
- 全局作用域在页面打开时创建、在页面关闭时销毁。
- 全局变量/函数都将作为window对象的属性保存。
- 函数作用域
- 在函数{}内,函数内创建的变量在函数外不可以被访问。
- 函数执行完毕,作用域销毁。 3.避免创建过多全局变量,
- 块级作用域(ES6
- es6新增,在语句块内{}创建的变量在语句块外不可以被访问。
作用域和执行上下文的区别
JavaScript属于解释型语言,JavaScript的执行分为:解释和执行两个阶段,这两个阶段所做的事并不一样:
解释阶段: 词法分析 语法分析 作用域规则确定
执行阶段: 创建执行上下文 执行函数代码 垃圾回收
区别
- 执行上下文在运行时确定,随时可能改变;作用域在定义时就确定,并且不会改变。
- 一个作用域下可包含多个执行上下文,或者一个都没有(没有执行)
- 一个作用域下,不同的调用会产生不同的执行上下文
作用域链
内层作用域可以访问外层作用域,这种一层一层的作用域嵌套在一起,就是作用域链。
如:如果当前作用域没有定义的变量,会成为 自由变量 。自由变量的值如何得到呢?它会向父级作用域一层一层地向外查找,直到找到全局window对象,也就是全局作用域,如果全局作用域里还没有,就返回undefined。类似于顺着一条链条从里往外一层一层查找变量,这条链条,我们就称之为作用域链。内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。