js词法作用域规则

function foo() {
console.log( a ); // 2不是3
}


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

var a = 2;
bar();

js中的作用域就是词法作用域 

词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规
则。 词法作用域最重要的特征是它的定义过程发生在代码的书写阶段( 假设你没有使用
eval() 或 with)

而动态作用域并不关心函数和作用域是如何声明以及在何处声明的, 只关心它们从何处调
用。 换句话说, 作用域链是基于调用栈的, 而不是代码中的作用域嵌套.

所以js的作用域是词法作用域即从函数书写时的位置寻找.

=====================================================================

主要区别: 词法作用域是在写代码或者说定义时确定的, 而动态作用域是在运行时确定
的。( this 也是! ) 词法作用域关注函数在何处声明, 而动态作用域关注函数从何处调用

原文地址:https://www.cnblogs.com/a-flydog/p/5527168.html