Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的作用域链和全局对象_Javascript - Fatal编程技术网

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
by
globalThis
是的,您的局部变量总是首选的,如果您想使用全局版本,您应该显式使用
window
关键字,但是如果您自己在全局scode上,您的变量定义将与window版本相同让我更新我的answer@nikoss起重与否无关用这个吧。而
/
常数
实际上仍被吊运。