[英]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.