日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

原文: https://2ality.com/2019/07/global-scope.html翻譯: 劉小夕

在這篇博文中,我們將研究 JAVAScript 的全局變量是如何工作的。如: scripts的范圍,所謂的全局對象等等。

1.作用域

變量的詞法作用域(簡稱:作用域)是可以訪問它的程序的區域。 JavaScript 的作用域是靜態的(它們在運行時不會改變)并且它們可以嵌套 - 例如:

function
 func
()
 
{
 
// (A)
 
const
 foo 
=
 
1
;
 
if
 
(
true
)
 
{
 
// (B)
 
const
 bar 
=
 
2
;
 
}
}

if 語句引入的作用域(行B)嵌套在函數 func()(行A)的作用域內。

在示例中, func 是 if 的外層作用域。

2.詞法作用域

在 JavaScript 語言規范中,作用域是通過詞法作用域“實現”的。它們由兩部分組成:

  • 將變量名映射到變量值的環境記錄(可以想象成是字典)。這是 JavaScript 存儲變量的地方。環境記錄中的一個 key-value 條目稱為綁定。
  • 對外部環境的引用 - 表示當前環境所代表的作用域的外部作用域的環境。

因此,嵌套作用域樹可以由嵌套環境樹表示。

3.全局對象

全局對象是一個對象,其屬性是全局變量。

  • 無處不在: globalThis
  • 全局對象的其他名稱取決于平臺和語言構造:
  • window:是引用全局對象的經典方式,但它只適用于普通瀏覽器環境; 不在 Node.js 和 WebWorkers 中。
  • self:在瀏覽器中隨處可用,包括 WebWorkers。但是 Node.js 不支持它。
  • global:僅在 Node.js 中可用。

全局對象包含所有內置全局變量。

4.全局環境

全局作用域是“最外層”作用域 - 它沒有外部作用域。它的環境是全局環境。每個環境都通過由外部引用鏈接的一系列環境與全局環境相關聯。全局環境的外部引用為 null。

全局環境結合了兩個環境記錄
  • 對象式環境記錄,其作用類似于普通環境記錄,但保持其綁定與對象同步。在這種情況下,對象是全局對象。
  • 聲明式環境記錄。

下圖顯示了這些數據結構。

 

JS全局變量是如何工作的?

 

 

接下來的兩個小節將解釋如何組合對象記錄和聲明式記錄。

4.1創建變量

為了創建一個真正全局的變量,你必須處于全局作用域內 - 必須要在 scripts 的頂層:

  • 頂級 const, let 和 class 在聲明式環境記錄中創建綁定。
  • 頂級 var 和函數聲明在對象式環境記錄中創建綁定。
<
script
>
 
const
 one 
=
 
1
;
 
var
 two 
=
 
2
;
</
script
>
<
script
>
 
// All scripts share the same top-level scope:
 console
.
log
(
one
);
 
// 1
 console
.
log
(
two
);
 
// 2
 
// Not all declarations create properties of the global object:
 console
.
log
(
window
.
one
);
 
// undefined
 console
.
log
(
window
.
two
);
 
// 2
</
script
>

此外,全局對象包含所有內置全局變量,并通過對象式記錄將它們給全局環境。

4.2讀取/設置變量

當我們獲取或設置變量并且兩個環境記錄都具有該變量的綁定時,聲明式環境記錄將獲勝:

<
script
>
 let foo 
=
 
1
;
 
// 聲明式環境記錄
 globalThis
.
foo 
=
 
2
;
 
// 對象式環境記錄
 console
.
log
(
foo
);
 
// 1 (聲明式記錄獲勝)
 console
.
log
(
globalThis
.
foo
);
 
// 2
</
script
>

5.模塊環境

每個模塊都有自己的環境,它存儲所有頂級聲明 - 包括導入。模塊環境的外部環境是全局環境。

結論:為什么JavaScript既有全局變量又有全局對象?

通常認為將全局變量掛載到全局對象上是錯誤的。因此,較新的構造(如 const, let 和 classes)會創建正常的全局變量,不會成為全局對象的屬性。(在 script作用域內時)。

值得慶幸的是,大多數用現代 JavaScript 編寫的代碼都存在于 ECMAScript 模塊和 CommonJS模塊中,每個模塊都有自己的作用域。

分享到:
標簽:全局變量 JS
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定