js作用域

js作用域

函数作用域里面可以访问全局作用域,反之不行。

js作用域里面的内部原理:编译-执行-查询-嵌套-执行

js脚本里没有编译的概念,而是边解释边执行 // 这句话有问题的吧。js从编译到执行过程javaScript`执行过程分为两个阶段,编译阶段和执行阶段。本文将重点分析第二阶段,并且在这基础 – 掘金

js在当前作用域无法找到某个变量时,会向上一级的作用域进行查找,直到找到最外层的全局作用域为止。

最后一行,a是定义在全局对象window上的变量(非严格模式),严格模式下,a的引用会报错

作用域分为词法作用域,和动态作用域。js中不存在动态作用域。

作用域从最具体的一个开始,向上进行查找到第一个匹配的标识符。更具体的标识符,会遮蔽同名的更上层作用域里的标识符。

变量的声明提升:遇到var关键字,会把var语句提到当前作用域的最上面。也叫做预解释。

比如如下代码;

console.log(a);
var a = 2;

经过变量提升后,会变成:

var a;
console.log(a);
a = 2;

所以输出值是undefined

下面的代码,3个输出打印都是undefined.

函数的声明提升:

fn()
function fn() {
    xxx;
}

以上的代码不会报错。

但是函数表达式不会提升。具名的函数表达式也不会提升。

后面的函数声明会覆盖前面的。

自由变量:在当前作用域中存在但是没有在当前作用域中声明的变量。一旦存在自由变量,就一定有作用域链。查找机制是,沿着作用域链往上级查找,直到查到对应变量为止。如果查找不到,直接报错。

有一个执行环境栈

发表回复

*您的电子邮件地址不会被公开。必填项已标记为 。

*
*