javascript中的作用域链和全局对象
当我们在全局范围javascript中的作用域链和全局对象,javascript,Javascript,当我们在全局范围var x=10中用var关键字声明变量时,则在全局对象(窗口、全局、自身、全局)中创建具有相同名称的属性,具体取决于环境。所以,我的问题是: 如果我试图访问该变量console.log(x)js将首先在我声明的代码中查找它,看看它是否在那里,或者它是否将直接跳转到全局对象?我知道如果我这样做: let myVar = 20; globalThis.myVar = 30; console.log(myVar) // 20, so my let declaration is re
var x=10中用var
关键字声明变量时代码>,则在全局对象(窗口、全局、自身、全局)中创建具有相同名称的属性,具体取决于环境。所以,我的问题是:
如果我试图访问该变量console.log(x)
js将首先在我声明的代码中查找它,看看它是否在那里,或者它是否将直接跳转到全局对象?我知道如果我这样做:
let myVar = 20;
globalThis.myVar = 30;
console.log(myVar) // 20, so my let declaration is readed first.
但是var
声明会发生什么情况?在浏览器中,窗口对象的子对象可以通过其名称直接访问,而无需显式窗口。
当您创建局部变量时,即使名称存在于窗口下,也会对其进行阴影处理,因此将首先访问yes local
在编程中,这叫做wiki,你可以在我链接的wiki上阅读更多内容
注:如果你在全局范围内使用var
,就好像你在窗口下声明了一样,我将用一个片段来演示这一点
var foo=12;
console.log(window.foo)//12
window.foo=10
console.log(foo)//10
//但是,如果使用let或const,则不会发生这种情况
这是否回答了您的问题?在全局范围内,let
关键字不会在全局对象(globalThis)上创建属性,而var
关键字会创建属性。我知道这一点,现在,请更改变量的let声明。首先读取哪一个var-myVar
或globalThis.myVar
?@DiegoPerdomo其实没有什么区别。在全球范围内,它们是相同的。标识符的正常范围规则适用,如果没有该名称的本地(或词汇)变量,它从全局对象支持的作用域中读取。因此,如果我有var myVar
和globalThis.myVar
首先读取var myVar
?javascript在涉及到var的作用域时,由于一种称为提升的东西,这就是为什么要使用const和let的原因window
byglobalThis
是的,您的局部变量总是首选的,如果您想使用全局版本,您应该显式使用window
关键字,但是如果您自己在全局scode上,您的变量定义将与window版本相同让我更新我的answer@nikoss起重与否无关用这个吧。而让
/常数
实际上仍被吊运。