javascript(js)词法作用域以及动态作用域
词法作用域(静态作用域)
词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的
function foo(a) {
var b = a * 2;
// a=1 b=2 c=4
function bar(c) {
console.log( a, b, c );
}
bar(b * 2);
}
foo( 1 ); // 1 2 4
// bar首先会从bar内部寻找a,b,c.
// 所以bar会找到c = 4; a,b没有,往上一层找.
// 找到a = 2 , b = 4
动态作用域
动态作用域并不关心函数和作用域是如何声明以及在任何处声明的,只关心它们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套
var a = 2;
function foo() {
console.log( a );
}
function bar() {
var a = 3;
foo();
}
bar();
// 1.如果处于词法作用域,也就是现在的javascript环境。
变量a首先在foo()函数中查找,没有找到。
于是顺着作用域链到全局作用域中查找,找到并赋值为2。
所以控制台输出2
// 2.如果处于动态作用域,同样地,变量a首先在foo()中查找,没有找到。
这里会顺着调用栈在调用foo()函数的地方,也就是bar()函数中查找,找到并赋值为3。
所以控制台输出3
区别
词法作用域是在定义时确定的,而动态作用域是在运行时确定的
参考链接
还没有评论,来说两句吧...