作用域
先來談?wù)勛兞康淖饔糜?br>
變量的作用域無非就是兩種:全局變量和局部變量。
全局作用域:
最外層函數(shù)定義的變量擁有全局作用域盒至,即對任何內(nèi)部函數(shù)來說酗洒,都是可以訪問的:
<script>
var outerVar = "outer";
function fn(){
console.log(outerVar);
}
fn();//result:outer
</script>
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問到枷遂,而對于函數(shù)外部是無法訪問的樱衷,最常見的例如函數(shù)內(nèi)部
<script>
function fn(){
var innerVar = "inner";
}
fn();
console.log(innerVar);// ReferenceError: innerVar is not defined
</script>
需要注意的是,函數(shù)內(nèi)部聲明變量的時候酒唉,一定要使用var命令矩桂。如果不用的話,你實際上聲明了一個全局變量痪伦!
作用域鏈(Scope Chain)
那什么是作用域鏈侄榴?
當(dāng)我們在局部作用域中雹锣,訪問一個變量時,系統(tǒng)首先會在當(dāng)前作用域中尋找變量var的聲明語句癞蚕,如找到則直接使用蕊爵。反之,則繼續(xù)向上一級作用域中尋找var的聲明語句桦山,如找到則直接使用攒射,反之,繼續(xù)向上一級作用域中去尋找…直到全局作用域恒水,如找到則直接使用匆篓,如未找到則直接在全局作用域中聲明該變量,我們把這種鏈?zhǔn)讲樵冴P(guān)系就稱之為為作用域鏈寇窑!
// 全局作用域: script標(biāo)簽包裹的內(nèi)容就是一個作用域
var abc = 123;
// fn 中能訪問到的變量由那些:
// 1 自身定義的變量
// 2 上一級作用域中的變量(全局作用域)
// foo 中能訪問到的變量由那些:
// 1 自身定義的變量
// 2 函數(shù)fn中的變量
// 3 全局作用域中的變量
function fn() {
var a = 456;
function foo() {
var num = 123;
// f的作用域鏈: f作用域 -> foo作用域 -> fn作用域 -> 全局作用域
function f() {}
}
foo();
// console.log(num);
}
注意
- 函數(shù)在執(zhí)行的過程中,先從自己內(nèi)部找變量
- 如果找不到箩张,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上
- 注意找的是變量的當(dāng)前的狀態(tài)