一.作用域
作用域指的是變量存在的范圍。ES5 有2種。一是全局作用域,變量在整個程序中一直存在,所有地方都可以讀??;二是函數(shù)作用域,變量只在函數(shù)內(nèi)部存在。
全局變量:函數(shù)外部聲明的變量就是,它可以在函數(shù)內(nèi)部讀取。
局部變量:在函數(shù)內(nèi)部定義的變量,外部無法讀取。
注意:函數(shù)內(nèi)部定義的變量,會在該作用域內(nèi)覆蓋同名全局變量。
二.執(zhí)行函數(shù)過程中,內(nèi)部變量的查找順序。
函數(shù)在執(zhí)行的過程中,先從自己內(nèi)部找變量。如果找不到,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上。(注:函數(shù)執(zhí)行時所在的作用域,是定義時的作用域,而不是調(diào)用時所在的作用域)
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn()
// 2 調(diào)用fn1,調(diào)用fn3,調(diào)用fn2 ,console.log(a),fn2內(nèi)沒有變量a,便查找fn2聲明所在的作用域fn1找到var a =2。
三.函數(shù)作用域與變量提升
與全局作用域一樣,函數(shù)作用域內(nèi)部也會產(chǎn)生“變量提升”現(xiàn)象。var命令聲明的變量,不管在什么位置,變量聲明都會被提升到函數(shù)體的頭部
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
fn2()
var a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn()
// undefined 注意:因為函數(shù)fn2調(diào)用在var a = 4 之前,所以fn2讀取的是變量前置的a的初始值undefined??梢钥闯梢韵?。
var a = 1
function fn1(){
function fn3(){
var a
function fn2(){
console.log(a)
}
fn2()
a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn()