今天,我們來聊聊作用域!
為什么
因?yàn)閷W(xué)習(xí)Javascript,這是最基本的概念之一,是構(gòu)造我們Javascript知識(shí)樹的一根大樹干。
當(dāng)然還有許多其它大樹干,比如原型鏈,這個(gè)以后再聊。
從哪里聊起
當(dāng)然是從概念開始。
首先我們知道,絕大多數(shù)流行的開發(fā)語言都是由外國人發(fā)明的,而使用的語言里英語又占了絕大多數(shù)。所以像作用域這樣的概念毫無疑問也是由英語翻譯過來的。
第一次接觸到作用域這個(gè)概念感覺好高端:“這個(gè)是什么玩意,怎么個(gè)玩法”?
結(jié)果查了一下洋文:

原來作用域的洋文就是scope,作用域的概念我不懂,但是scope這個(gè)單詞的中文翻譯我還是知道的,就是范圍的意思!
以上洋文的大概意思是:
-
Javascript中有全局作用域和局部作用域 - 每個(gè)函數(shù)會(huì)創(chuàng)造一個(gè)新的作用域
- 作用域決定了變量的可訪問性
- 函數(shù)內(nèi)部的變量不能被外部的函數(shù)訪問
與現(xiàn)實(shí)的聯(lián)系
我想起一句話:藝術(shù)源于生活而高于生活!
而Javascript中作用域的特點(diǎn)也一樣可以借鑒于現(xiàn)實(shí)生活,比如說公司!
如果把Javascript當(dāng)成公司,那么:
-
Javascript中有全局作用域和局部作用域
相當(dāng)于:在公司在里大部門和小部門,這個(gè)非常好理解,因?yàn)樵诂F(xiàn)實(shí)中就是這樣的 - 每個(gè)函數(shù)會(huì)創(chuàng)造一個(gè)新的作用域
相當(dāng)于:每個(gè)部門都有自己的職責(zé) - 作用域決定了變量的可訪問性
相當(dāng)于:部門決定了其員工的工作范圍 - 函數(shù)內(nèi)部的變量不能變外部的函數(shù)訪問
相當(dāng)于:部門內(nèi)部的員工不能被同級(jí)/上級(jí)部門使用
這么大白話翻譯過來一下子就好懂很多了!
作用域鏈
與現(xiàn)實(shí)聯(lián)系起來來理解作用域鏈那就簡單多了,比如A部門是掛在B部門下的,B部門是掛在C部門下的,C部門是掛在D部門下,這樣可以一直往上追溯到公司的最高層,這種層級(jí)就像一條鏈子,在Javascript中叫做作用域鏈
大概就是長這樣的:
function A部門(){
var 員工1;
var 員工2;
function B1部門(){
var 員工1;
var 員工2;
function C部門(){
var 員工1;
}
}
function B2部門(){
var 員工1;
var 員工2;
function C部門(){
var 員工1;
}
}
}
注意
現(xiàn)實(shí)生活有時(shí)候是很靈活的,比如A部門臨時(shí)調(diào)了同級(jí)B部門的某同事來幫忙,或者A部門調(diào)用其子部門的某同事來幫忙這些都是理所當(dāng)然的事。
但是在代碼的世界,有時(shí)就沒有那么靈活,畢竟生活不嚴(yán)格等于代碼,差異性是存在的,求同存異也是一種態(tài)度!
那么在javascript世界里:
- 同級(jí)部門的員工不能互相調(diào)用,這是規(guī)定!
- 上級(jí)部門不能調(diào)用下級(jí)部門的員工,這也是規(guī)定!
- 下級(jí)部門可以調(diào)用上級(jí)部門里的員工,這也是規(guī)定!
function 最頂級(jí)部門(){
var 張三;
//?最頂級(jí)部門不能調(diào)用下級(jí)A部門里李四
//?最頂級(jí)部門不能調(diào)用下級(jí)B部門里王五
function A部門(){
var 李四;
//A部門里不能調(diào)用同級(jí)部門里的 王五
//A部門里可以調(diào)用上級(jí)部門里的 張三
}
function B部門(){
var 王五;
//B部門里不能調(diào)用同級(jí)部門里的 李四
//B部門里可以調(diào)用上級(jí)部門里的 張三
}
}
完!