作用域
在JS中作用域是一個(gè)相當(dāng)重要的概念,我們一般把作用域分為兩類:即靜態(tài)作用域和動(dòng)態(tài)作用域,JS采用的就是靜態(tài)作用域(詞法作用域)
對(duì)于靜態(tài)作用域有一個(gè)相當(dāng)重要的點(diǎn)是: 函數(shù)的作用域在函數(shù)定義的時(shí)候就決定了, 這個(gè)相當(dāng)重要哦,接下來我們直接看一個(gè)例子:
var value = 100;
function foo() {
console.log(value);
}
function bar() {
var value = 1;
foo();
}
bar();
我們先看下在控制臺(tái)的執(zhí)行結(jié)果 =>

default
接下來相必有些人這里有些疑問了,為什么這里的console.log的結(jié)果是100而不是1哈,其實(shí)是這樣的
當(dāng)我們調(diào)用bar()的時(shí)候會(huì)在函數(shù)內(nèi)部調(diào)用foo()函數(shù),但是還記得我們上面說了函數(shù)的作用域在函數(shù)定義的時(shí)候就決定了。
也就是說當(dāng)我們?cè)诙xfoo這個(gè)函數(shù)的時(shí)候,根據(jù)作用域鏈的查找: foo內(nèi)部沒有申明value變量,我們就到全局查找到value的值是100(這個(gè)是在函數(shù)定義的時(shí)候已經(jīng)被決定了),當(dāng)我們調(diào)用foo()的時(shí)候,打印的結(jié)果自然就是100。
假設(shè)JS這門語言在設(shè)計(jì)的時(shí)候采用的是動(dòng)態(tài)作用域(函數(shù)的作用域是在函數(shù)調(diào)用的時(shí)候才決定的),那么這里的執(zhí)行結(jié)果就是1了。