重識 JavaScript —— 作用域(二)

Javascript 語言特有的”鏈式作用域”結構(chain scope)

即子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。

塊作用域與函數作用域

函數可以訪問函數外部申明的變量,但是函數外部不能反過來訪問函數內部的局部變量。

需要注意的是在 JavaScript 中,區域塊(ifforwhileswitchtry)內的變量是可以在區域塊外部訪問的。

try {
    var value1 = "from try block"
}catch(e) {

}

if(true) {
    var value2 = "from block";
}

var f3 = function() {
    var value3 = "from function";
}
console.log("value1: " + value1); // value1: from try block
console.log("value2: " + value2); // value2: from block
console.log("value3: " + value3); // Uncaught ReferenceError: value3 is not defined

不要忽略 var

Yes,don’t ignore var

不知道你剛開始寫 JS 程序會不會在申明變量時忘掉寫 var ,反正最初的我是覺得寫和不寫沒差而不寫 var

在申明變量不寫 var 的時候會申明一個全局變量。而在 HTML 文檔中,所有全局變量都屬於 window 對象中。

也就是說你的全局變量,或者函數,可以覆蓋 window 對象的變量或者函數。
局部變量,包括 window 對象可以覆蓋全局變量和函數。

foo = "hello";

console.log(window.foo == foo); // true;

// 實時證明當 JavaScript 運行在瀏覽器中時,全局變量會作爲 window 對象的屬性

// location = "https://baidu.com"; // 全局變量 location 會讓瀏覽器跳轉至該鏈接

需要補充說明的是在最外層的 <script></script> 中就算你使用 var 來聲明變量和函數,這個成員也會歸爲 window 對象“所有”。對於這個現象我的理解是:最外層相當於是我們的最大的一個作用域,所以無論你怎麼申明都會成爲 window 的成員。

一圖勝千言

這裏寫圖片描述

這裏的全局作用域是直接在 <script></script> 裏、即 v1 、v2 的值會在 window 對象下,內層作用域可以訪問外層的作用域,但是內層作用域裏的值會被圍牆圍起來不讓外層作用域訪問。

疑問?

在 JS 裏,我們有沒有方法打破常規,在外層作用域訪問內層作用域的值呢?

發佈了143 篇原創文章 · 獲贊 143 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章