Javascript 語言特有的”鏈式作用域”結構(chain scope)
即子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。
塊作用域與函數作用域
函數可以訪問函數外部申明的變量,但是函數外部不能反過來訪問函數內部的局部變量。
需要注意的是在 JavaScript 中,區域塊(if
、for
、while
、switch
、try
)內的變量是可以在區域塊外部訪問的。
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 裏,我們有沒有方法打破常規,在外層作用域訪問內層作用域的值呢?