js變量作用域


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沒有效果

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容