常見的作用域可以分爲幾個類型:全局作用域,函數作用域,塊狀作用域和動態作用域。
對象 | 類型 |
global/window | 全局作用域 |
function | 函數作用域 |
{} | 塊狀作用域 |
this | 動態作用域 |
如果一個變量或者其他表達式不在“當前作用域”,那麼JavaScript機制會繼續沿着作用域鏈上查找直到全局作用域(global或者瀏覽器中的window)如果找不到將不可被使用。作用域也可以根據代碼層次分層,以便子作用域可以訪問父作用域,通常是指沿着鏈式的作用域鏈查找,而不能從作用域引用子作用域中的變量和引用
- 全局作用域
變量在函數或者代碼塊{}外定義即爲全局作用域。不過,在函數或者代碼塊{}內未定義的變量也擁有全局作用域的(不推薦)
- 函數作用域
在函數內部定義的變量,就是局部作用域。函數作用域內,對外是封閉的,從外層的作用域無法直接訪問函數內部的作用域!
- 塊級作用域
在其他編程語言中,塊狀作用域是很熟悉的概念,但是在JavaScript中不被支持,就像上述只是一樣,除了全局作用域就是函數作用域,一直沒有自己的塊級作用域。在ES6中已經改變了這個現象,塊狀作用域得到普及。關於什麼是塊,只要認識{}就可以了。
- 動態作用域
在Javascript中很多人對this的指向時而清楚時而模糊,其實結合作用域會對this有一個清晰的理解。