JS中的變數作用域(console版)
作用域說明:指一個變數的作用範圍
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();
到此這篇關於JS中作用域以及變數範圍的文章就介紹到這了,更多相關JS作用域內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!