js 词法作用域和动态作用域

词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。动态作用域是在运行时根据程序的流程信息来动态确定的,而不是在写代码时进行静态确定的。

js是本身是词法作用域.举个例子:

function foo() {
    console.log(a);
}

function bar() {
    var a = 3;
    foo();
}

var a = 2;
bar(); // 2;

由于js是词法作用域,在词法分析阶段就确定了foo函数获取的是全局作用域里的var a=2;所以无论bar函数里重新定义了a变量 依旧会输出2;

假设js是动态作用域的话,在程序运行的时候才会确定,所以当程序运行到var a=3的时候 foo的输出自然是3了。

##词法作用域代码解析:bar() 会调用 foo(),foo() 再查询所需变量,因为函数是在foo处声明的,所以会从foo所在作用域进行查找,所得结果为"2";

##动态作用域代码解析:由于函数是从 bar()开始调用的,因此会从 bar()所在作用域查找变量,因此按照动态作用域的运行结果得到的结果是"3".

一句话概括:词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用

原文地址:https://www.cnblogs.com/tudou1223/p/9864875.html