簡體   English   中英

Javascript 中的聲明性環境記錄和范圍

[英]Declarative Environment Records and Scopes in Javascript

我目前正在學習 Javascript 范圍,並嘗試為正在發生的事情制定一些規則。 但每次意外的行為都會打破他們。 所以我需要幫助。

考慮以下示例

 console.log("v" in this); //true console.log(v) //undefined { { function a() { 1; } } { function a() { 2; } { function v() { 3; } } } } console.log(a); //ƒ a() {2}

function v在 memory 但我不能在第 2 行使用它。但在這個例子中我可以。

 console.log(v); { function v() { 1; } }

我對編譯器在執行腳本之前執行的規則以及評估聲明的步驟(順序)感到困惑,包括使用let、const、var以及function聲明和class聲明的語句。 我已經閱讀了有關范圍的博客、書籍,但幾乎所有這些都將變量、函數和類視為獨立的東西,而不是 scope 的 DER 中附加的屬性

function v在 memory 但我不能在第 2 行使用它。但在這個例子中我可以

不,兩個示例的行為方式相同。 在這兩種情況下, v都是在塊內聲明的,並且在這兩種情況下,它的值undefined在您記錄它的位置。

In loose mode (aka "sloppy" mode), a function declaration in a block that fits certain criteria creates a hoisted binding ( v , in this case) in the function (or global) scope, not block scope. 該綁定使用值undefined進行初始化; 在代碼的逐步執行中達到聲明之前,它不會獲得分配給它的 function。 還有一個隱藏函數/全局綁定的塊本地綁定,它在塊的開頭使用 function 進行初始化。 是的,這令人困惑; 這是因為這將 ES2015 中的規則追溯應用到跨瀏覽器引擎的通用功能子集,這些瀏覽器引擎擴展了 JavaScript 與塊聲明的功能(不在規范中,但是允許的擴展)。

但是,不要依賴它,甚至真的懶得將它提交給 memory。 這是遺留兼容性的東西。

相反,使用嚴格模式,其中聲明成為塊的本地(在塊內完全提升)並且您不能在它之外使用v

 "use strict"; console.log("v" in this); // false console.log(v) // ReferenceError { { function a() { 1; } } { function a() { 2; } { function v() { 3; } } } } console.log(a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM