未定义的变量什么时候会抛出一个 Uncaught TypeError 而不是只有 'undefined' 的值?

When does an undefined variable throw an Uncaught TypeError instead of just having a value of 'undefined'?

基本上在我正在编辑的代码中,有一个函数接收一个对象参数,该参数有 2 个可能的 key/value 对,但根据某些条件只能使用其中一个:

这是将 foobar 解构为单个键的函数:

function someFunction({ foo, bar }) {
  console.log(foo); // can be either { foo: "123"} or undefined
  console.log(bar); // can be either { bar: "321"} or undefined
}

这是我们将 foobar 参数传递给 someFunction() 的地方:

function anotherFunction(foobar) {
  console.log(foobar); // can be either { foo: "123"} or { bar: "321"}
  someFunction(foobar);
}

这是 foobar 参数的来源,它的值取决于某些条件:

if(someConditionIsMet) {
  anotherFunction({ foo: "123"});
} else {
  anotherFunction({ bar: "321"});
}

但有时,如果我在某处有一个未定义的变量,我会得到一个 Uncaught TypeError: Cannot read property of undefined 而程序根本不会 运行。

例如当我调用 someFunction(foobar) 时,我期待得到一个 Uncaught TypeError,因为其中一个变量肯定是 undefined。不过,这里的函数还是运行s.

为什么会这样?

未定义的变量就是:变量,names,你已经在你的代码中使用了,但是运行时不知道它应该指的是什么,因为你有从未引入那个变量名。

这里你分明是在引入foobar作为函数参数。运行时很清楚这些变量来自何处,它们的范围是什么等等。只是它们没有被分配 value/they 并保持值 undefined未定义的变量 是您突然引用的变量,但您没有在任何地方使用 varletconst 或作为函数参数声明它们。例如:

console.log(foo);

我从来没有定义过 foo 是什么,它来自哪里或者它的值应该是什么,所以这是一个错误。

许多编程语言的设计原则是,如果一段代码不太可能按预期运行,那么尽快发出警告要比简单地让代码以意外的方式运行更可取。虽然 JavaScript 的许多方面在这方面没有帮助,但 "use strict" 方言试图在某些情况下提供帮助。

这里描述的情况在这方面特别重要,因为在非 "use strict" 方言中,尝试在未定义的函数中使用变量具有有效的指定含义(创建外部上下文中的变量)有时会依赖它。尽管在某些情况下 "use strict" 会导致具有一种有效含义的代码改为具有不同的有效含义,但其中大多数不会经常出现。如果尝试使用未在函数中定义的变量的代码的含义更改为在该函数中创建变量,则依赖旧行为的代码将停止工作,而无需任何诊断说明原因。