靜態(tài)作用域與動態(tài)作用域
因為 JavaScript 采用的是詞法作用域,函數(shù)的作用域在函數(shù)定義的時候就決定了。
而與詞法作用域相對的是動態(tài)作用域,函數(shù)的作用域是在函數(shù)調(diào)用的時候才決定的。
學(xué)過編譯原理的同學(xué)應(yīng)該知道這兩者的區(qū)別
看下列的區(qū)別
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的靜態(tài)作用域所造成的區(qū)別,假設(shè)js是動態(tài)作用域的話,那么兩個例子輸出就應(yīng)該都是2啦
在《JavaScript權(quán)威指南》中有如下的例子,我們可以看下,順便鞏固對js靜態(tài)作用域的理解
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采用的是詞法作用域,函數(shù)的作用域基于函數(shù)創(chuàng)建的位置。