作用域?
成都創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設|成都網(wǎng)站維護|優(yōu)化|托管以及網(wǎng)絡推廣,積累了大量的網(wǎng)站設計與制作經(jīng)驗,為許多企業(yè)提供了網(wǎng)站定制設計服務,案例作品覆蓋成都被動防護網(wǎng)等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結合品牌形象的塑造,量身制作品質(zhì)網(wǎng)站。
幾乎所有的編程語言的最基礎模型之一就是在變量中儲存值,并且取出修改這些的值的能力,事實上,在變量中存儲值和取出值的能力,給程序賦予了狀態(tài)。如果沒有這樣的概念,一個程序雖然可以執(zhí)行一些任務,但是它們將會受到極大的限制而且不會非常有趣。但是這些變量該存儲在哪,又給如何讀???為了完成這個目標,需要制定一些規(guī)則,這個規(guī)則就是:作用域;
作用域主要有哪幾種?
作用域主要分為全局作用域、函數(shù)作用域、動態(tài)作用域、塊級作用域;
對象 | 類型 |
---|---|
window | 全局作用域 |
fn | 函數(shù)作用域 |
{} | 塊級作用域 |
this | 動態(tài)作用域 |
作用域查找規(guī)則?
1、 執(zhí)行環(huán)境有全局作用域和函數(shù)作用域之分;
2、每次進入一個新的執(zhí)行環(huán)境,都會創(chuàng)建一個用于搜索變量和函數(shù)的作用域鏈;
3、函數(shù)的局部環(huán)境不僅可以訪問函數(shù)作用域內(nèi)的變量,還可以訪問包含起父級環(huán)境乃至全局環(huán)境;
4、全局環(huán)境只能訪問全局聲明的變量和函數(shù),而不能直接訪問局部環(huán)境重的任何數(shù)據(jù)。
全局作用域
變量在函數(shù)外定義,即為全局變量。
全局變量有全局作用域: 網(wǎng)頁中所有腳本和函數(shù)均可使用。
如果變量在函數(shù)內(nèi)沒有聲明(沒有使用var關鍵字),該變量為全局變量。
// 以下實例中 carName 在函數(shù)內(nèi),但是為全局變量。 // 此處可調(diào)用 carName 變量 function myFunction() { carName = "Volvo"; // 此處可調(diào)用 carName 變量 }
在函數(shù)內(nèi)部或代碼塊中沒有定義的變量上是作為 window/global 的屬性存在,沒有使用 var 定義的變量可以被 delete 的,而全局變量不可以。
函數(shù)作用域
函數(shù)內(nèi)部聲明的變量,稱為函數(shù)作用域。函數(shù)內(nèi)部的變量外部無法
直接訪問,可以通過retun 或者閉包的方式去訪問。
// 此處不能調(diào)用 carName 變量 function myFunction() { let carName = "Volvo"; // 函數(shù)內(nèi)可調(diào)用 carName 變量 } function myFunction() { let carName = "Volvo"; rerurn carName; // 函數(shù)內(nèi)可調(diào)用 carName 變量 } let fn=myFunction()//Volvo; function myFunction() { let carName = "Volvo"; function getName(){ console.log(carName) } return getName(); // 函數(shù)內(nèi)可調(diào)用 carName 變量 } myFunction() //Volvo
塊級作用域
es6出現(xiàn)后,用let命令新增了塊級作用域,外層作用域無法獲取到內(nèi)層作用域,非常安全明了.即使外層和內(nèi)層都使用相同變量名,也都互不干擾。
關于暫時性死區(qū) * 在使用let命令聲明變量之前,該變量都是不可用的。如果去調(diào)用這種情況被稱為暫時性死區(qū)。 let 特性 * let不存在變量提升 * let不允許重復聲明 * 擁有塊級作用域 * 不可以使用window去調(diào)用 const 特性 * 定義常量 * 不允許修改常量的值 * 不允許先聲明后賦值 * 同上 if(1){ let a = 1 console.log(a) }
動態(tài)作用域
動態(tài)作用域不關心函數(shù)和作用域是如何聲明以及在何處聲明的,只關心它們從何處調(diào)用。和this的機制就很像;
其實這里就有延伸出js的詞法作用域(靜態(tài)作用域),而與詞法作用域相對的是動態(tài)作用域,函數(shù)的作用域是在函數(shù)調(diào)用的時候才決定的
let name='youzi'; function getName(){ let name="tuzi"; function getAge(){ console.log(name) } return getAge(); } getName() //tuzi
詞法作用域
JavaScript采用的是詞法作用域,函數(shù)的作用域在函數(shù)定義的時候就決定了。
let name='youzi'; function getName(){ console.log(name) } function getAge(){ let name='tuzi'; getName() } getAge() //youzi
以上就是深入學習es6作用域的詳細內(nèi)容,更多請關注創(chuàng)新互聯(lián)其它相關文章!