何為作用域
任何編程語言都有作用域的概念喜颁,簡(jiǎn)單來說掘鄙,作用域就是變量與函數(shù)的可訪問范圍胸囱,即作用域控制著變量與函數(shù)的可見性和生命周期掌栅。
js的作用域是靠函數(shù)來形成的秩仆,也就是說一個(gè)函數(shù)的變量在函數(shù)外不可以訪問。
1. 全局作用域
任何地方都能訪問到的對(duì)象擁有全局作用域猾封。
- 函數(shù)外面定義的變量擁有全局作用域
var n = 2;
function fn() {
var a = 1;
return a;
}console.log(fn()); //1
console.log(n); //2
console.log(a); //報(bào)錯(cuò)error
- 未定義直接賦值的變量自動(dòng)聲明為擁有全局作用域
var n = 2;
function fn() {
a = 1;
return a;
}console.log(fn()); //1
console.log(n); //2
console.log(a); //1
2. 局部作用域
局部作用域一般只在固定的代碼片段內(nèi)可訪問到澄耍,最常見的例如函數(shù)內(nèi)部,所以在一些地方會(huì)把這種作用域成為函數(shù)作用域。
第一段代碼中齐莲,a是函數(shù)內(nèi)部聲明并賦值痢站,擁有局部作用域,只能帶函數(shù)fn內(nèi)部使用选酗,在fn外部使用就會(huì)報(bào)錯(cuò)阵难,這就是局部作用域的特性,外部無法訪問芒填。
作用域鏈
通俗地講呜叫,當(dāng)聲明一個(gè)函數(shù)時(shí),局部作用域一級(jí)一級(jí)向上包起來殿衰,就是作用域鏈朱庆。
當(dāng)執(zhí)行函數(shù)時(shí),總是先從函數(shù)內(nèi)部找尋局部變量
如果內(nèi)部找不到(函數(shù)的局部作用域沒有)播玖,則會(huì)向創(chuàng)建函數(shù)的作用域(聲明函數(shù)的作用域)尋找椎工,依次向上
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //1