静态作用域与动态作用域
因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。
而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。
学过编译原理的同学应该知道这两者的区别
看下列的区别
var value = 1;
function print(){
console.log(value);
}
function foo(){
var value = 2;
print();
}
foo();//1
var value = 1;
function foo(){
var value = 2;
function print(){
console.log(value);
}
print();
}
foo();//2
这就是js的静态作用域所造成的区别,假设js是动态作用域的话,那么两个例子输出就应该都是2啦
在《JavaScript权威指南》中有如下的例子,我们可以看下,顺便巩固对js静态作用域的理解
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
两段代码都会打印:local scope。
原因也很简单,因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。