Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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,由于并没有像b这样的全局变量,控制台应该抛出一个引用错误,但它说b是未定义的。我认为这意味着变量b是全局声明的,但没有赋值 你能解释一下这里发生了什么吗?(如果我的问题很傻,很抱歉)请在初级阶段解释。根据 ReferenceError对象表示引用不存在的变量时的错误 但当您引用window.b时,其中window被定义为对象,那么访问b就是请求一个不存在的对象,并且根据不存在的对象属性的默认值是未定义 我认为这意味着变量b是全局声明的,但没有赋值 不是真的。如果试图从对象访问不存在的属性,则会得

由于并没有像b这样的全局变量,控制台应该抛出一个引用错误,但它说b是未定义的。我认为这意味着变量b是全局声明的,但没有赋值

你能解释一下这里发生了什么吗?(如果我的问题很傻,很抱歉)请在初级阶段解释。

根据

ReferenceError
对象表示引用不存在的变量时的错误

但当您引用
window.b
时,其中
window
被定义为
对象
,那么访问
b
就是请求一个不存在的对象,并且根据不存在的对象属性的默认值是
未定义

我认为这意味着变量b是全局声明的,但没有赋值

不是真的。如果试图从对象访问不存在的属性,则会得到
未定义的属性。例如:

const obj={a:“a”};
log(`Property“b”存在于obj?${b”存在于obj}`);

log(`Value of obj.b:${obj.b}`)您可以通过多种方式访问对象。例如:

  • 美食酒吧
  • myObject['prop']
我们将foomyObject分别称为基值。而道具引用名称

当引用无法解决时,会发生引用错误。当基值未定义时会发生这种情况

在您的例子中,窗口是一个定义的全局对象。因此,定义了基准值,这不会导致参考错误


关于JS中未定义的含义的更多说明,您可以参考这一有用信息。

如果未找到属性,则对象的属性访问器将返回未定义的属性。
window.b
as
window[“b”]
,在最实际的层面上,如果从对象中读取不存在的属性时抛出错误,那么编写代码将非常烦人。毕竟,对象可以有任何形状,甚至可以经常更改,因此使用
try/catch
或任何其他错误处理来包围任何属性访问只会导致大量样板代码。请注意,如果调用
obj.foo.bar
,我们已经遇到了这种情况-第一个键可能不存在,这将引发错误。正因为如此,我们每周都会收到数百个问题。@VLAZ后一个JS陷阱幸运地被修复了,我们现在有了
?。
操作符在最新的JS版本中。@Teemu我之前的评论中没有字符了。但你是对的。这件事还需要一段时间。即使这样,我们也会收到数百个这样的问题:“为什么它说
obj.foo
未定义的
——我有
obj
!”。我也不认为这些问题的数量会在一段时间内显著减少。不理解为什么取消对不存在的属性的引用不起作用的人不太可能使用操作符来防范这种情况。所以,是的,它是固定的,但…它仍然会导致问题。在更好的实践得到推广之前,我们处于一种不确定状态。
//undefined . Why not a reference error instead?
console.log(window.b);