词法作用域和动态作用域
词法作用域和动态作用域
1、作用域:
作用域是指程序代码中定义变量的区域
JavaScript采用词法作用域,也就是静态作用域
2、词法作用域和动态作用域
因为JavaScript采用的是词法作用域,函数的作用域在函数定义的时候就决定了。
而与词法作用域对应的是动态作用域,函数的作用域是在函数调用的时候才决定的。动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心他们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。
var value = 1; function foo() { console.log(value); } function bar() { var value = 2; foo(); } bar(); // 结果是???
假设JavaScript采用静态作用域,分析执行过程:
执行foo()函数,先从foo函数内部查找是否有局部变量value,如果没有,就根据书写的位置查找上一层的代码,也就是value 等于 1,所以结果会打印 1 。
假设JavaScript采用动态作用域,分析执行过程:
执行foo()函数,依然是从foo函数内部查找是否有局部变量value,如果没有,就从调用函数的作用域也就是bar()函数内部查找value变量,所以结果会打印 2 。
前面已经说了,JavaScript采用的是词法作用域,所以这个例子结果是1
参考文章:https://www.cnblogs.com/xiaohuochai/p/5700095.html