在JS執(zhí)行的時候,會在當前上下文尋找變量的具體值.如果一個變量或者其他表達式不在"當前的作用域",JS機制會繼續(xù)沿著作用域鏈上查找直到全局作用域,如果找不到將不可被使用.
作用域根據(jù)代碼層次分層厢破,子作用域可以訪問父作用域惯裕,通常是指沿著鏈式的作用域鏈查找闪盔,不能從父作用域引用子作用域中的變量和引用蓝谨。
例一:
var x = 10;
bar()
function bar() {
var x = 30;
function foo() {
console.log(x)
}
foo();
}
輸出結(jié)果: 30
function foo()中沒有x的賦值,往父作用域,找到var x=30
例二:
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()
輸出結(jié)果: 2
function fn2()中沒找到a的賦值,往父作用域fn1()里找到a=2.
a=4在與fn2平行的fn3中,
a=1在更外層,所以沒有對fn2生效.
例三:
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
fn2(),沒有賦值,外父作用域?qū)ふ业?a = 1
例四:
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
fn2()沒有賦值,直到fn1()找到var a
但是因為變量前置的效果,只找到了聲明var a,a的賦值還在原來的位置.
" var a
fn2()
a = 4 "
可以修改順序
" var a = 4
fn2()"
讓a=4賦值生效