title: 變量作用域
date: 2016-11-24 19:58:57
tags: javascript
categories:
- javascript
靜態作用域
- 又稱此法作用域
- 由程序定義的位置決定
var x = 10 ;
function foo(){
alert(x);
}
function bar(){
var x = 20;
foo();
}
bar()
這里執行foo()函數時,由于其內部沒有定義x,程序就會到其外層作用域(全局)尋找
動態作用域
- 由程序運行的時刻決定
JS變量作用域
- js使用靜態作用域
- js沒有塊級作用域(全局作用域,函數作用域)
- ES5中使用詞法環境管理靜態作用域
詞法環境
- 環境記錄
- 形參
- 函數聲明
- 變量
- 對外部環境的引用(outer)
環境記錄初始化-聲明提前
全局代碼或者函數代碼執行前,先把函數聲明、變量定義到環境記錄里面
詞法環境-width
var foo = "abc";
width ({
foo: "bar"
}) {
function f(){
alert(foo);
};
(function(){
alert(foo);
})();
f();
}
with傳入一個對象,并把這個對象定義到臨時詞法環境里面,創建一個臨時作用域
這里函數表達式會使用這個作用域,而函數聲明還是使用全局作用域
詞法環境 try-catch
try{
var e = 10;
throw new Error();
}catch(e){
function f(){
alert(foo);
};
(function(){
alert(foo);
})();
f();
}
catch會創建一個臨時環境,執行匿名函數是會使用這個臨時環境,而函數聲明的環境還是指向全局環境
帶函數名稱的函數表達式
(function A(){
A = 1;
alert(A);
})()
這里在執行時換創建一個新的詞法環境,把A定義到這個環境記錄里,并且A無法被修改,所以這里語句 A=1
沒有效果