作用域
-
JavaScript作用域就是代碼名字(一般是變量)在某個範圍內起作用和效果。
-
作用:提高了程序邏輯的局部性, 增強了程序的可靠性,減少了名字衝突。
-
JavaScript的作用域分爲以下兩種:
(1)全局作用域:在整個script標籤或者一個單獨的js文件內起作用
(2)局部作用域(函數作用域):只能在函數內部起效果和作用
全局變量和局部變量
-
根據作用域的不同,變量可以分爲全局變量和局部變量。
(1)全局變量:在全局作用域下的變量,在全局下都可以使用,包括函數內部。並且,全局變量只有瀏覽器關閉的時候纔會銷燬,比較佔內存資源。
(2)局部變量:在局部作用域下的變量,或者說成在函數內部的變量。並且,局部變量在程序執行完畢後就會立即銷燬,比較節約內存資源。
注意:
(1)在函數內部沒有聲明就直接賦值的變量是全局變量
(2)函數的形參可以看作是局部變量
作用域鏈
- 作用域鏈:內部函數訪問外部函數的變量,採取的是鏈式查找的方式來決定取哪個值。(就近原則)
var num = 22;
function fn(){ //外部函數
var num = 33;
function fun(){ //內部函數
console.log(num);
}
fun();
}
fn(); //輸出結果是:33
拓展(塊級作用域)
-
在ES6之前是沒有塊作用域的概念,而ES6中新增了塊級作用域。
-
任何一對花括號({})中的語句集都屬於一個塊,在這之中定義的所有變量在代碼塊外都是不可見的,我們稱之爲塊級作用域。在ES6中只要{}沒有和函數結合在一起,那麼應該就是“塊級作用域”。
-
塊作用域由 { } 包括,if語句和for語句裏面的{ }也屬於塊作用域。
-
在塊級作用域中,var定義的變量是全局變量,let定義的變量是局部變量。而在局部作用域中,無論是用var定義的變量還是用let定義的變量都是局部變量。
-
無論是在塊級作用域還是局部作用域,省略變量前面的var或者let都會變成一個全局變量。
微信公衆號也會定期更新,覺得文章寫得還可以的,可以加個關注!點個贊!謝謝!