1. 程式人生 > >JS中的變數作用域

JS中的變數作用域

作用域說明:指一個變數的作用範圍

1.全域性作用域

(1) 全域性作用域在頁面開啟時被建立,頁面關閉時被銷燬
(2) 編寫在script標籤中的變數和函式,作用域為全域性,在頁面的任意位置都可以訪問到
(3) 在全域性作用域中有全域性物件window,代表一個瀏覽器視窗,由瀏覽器建立,可以直接呼叫

(4) 全域性作用域中宣告的變數和函式會作為window物件的屬性和方法儲存

var a = 10;
b = 20;
function an(){
    console.log('an')
}
var bn = function(){
    console.log('bn')
}
console.log(window)

如圖,變數a,b和函式an,bn都儲存在window物件上


(5) window物件的屬性和方法可以直接呼叫,如window.an() 可以寫為 an()

2.函式作用域:

(1) 呼叫函式時,函式作用域被建立,函式執行完畢,函式作用域被銷燬

function an(){
    var s = 'an'
    console.log(s);
}
//an();

此時函式an並沒有執行,作用域沒有建立,當函式執行時,作用域建立,輸出結果an

an();

(2) 每呼叫一次函式就會建立一個新的函式作用域,他們之間是相互獨立的

(3) 在函式作用域中可以訪問到全域性作用域的變數,在函式外無法訪問到函式作用域內的變數

function an(){
    var s = 'an'
    console.log(s);
}
an();
console.log(s);  // 此時,程式會從當前作用域和上級作用域及以上作用域中尋找變數s,並不會去下級作用域中尋找

(4) 在函式作用域中訪問變數、函式時,會先在自身作用域中尋找,若沒有找到,則會到函式的上一級作用域中尋找,一直到全域性作用域

(5) 在函式作用域中也有宣告提前的特性,對於變數和函式都起作用,此時函式作用域相當於一個小的全域性作用域,詳細宣告提前請看宣告提前部分

an();
bn();
function an(){
    var s = 'an'
    console.log(s);
}
var bn = function(){
    console.log('bn')
}

下圖就結果中,an()可以正常執行,函式an()提升並建立了,函式bn的變數名提升了,但是為賦值,此時bn不是函式

(6) 在函式作用域中,不使用變數關鍵字宣告的變數,在賦值時會往上一級作用域尋找已經宣告的同名變數,直到全域性作用域時還沒找到,則會成為window的屬性

an(); // 輸出結果 bn
function an(){
    var b = 'bn';
    function bn(){
        console.log(b); 
	b = 'bn2';   // b會往上一級尋找已經宣告的同名變數,並賦值,直到全域性作用域時還沒找到,則會成為window的屬性
    }
    bn();
    console.log(b); // 輸出 bn2
}

(7) 在函式中定義形參,等同於宣告變數

function an(name){
    console.log(name); // 輸出 undefined
}
an();

等同於

function an(){
    var name
    console.log(name); // 輸出 undefined
}
an();