【问题标题】:Check for typeOf undefined not working?检查 typeOf undefined 不起作用?
【发布时间】:2017-08-24 16:04:26
【问题描述】:

有人可以解释为什么这不起作用吗?

setOrientation: function() {
    if (typeof oldOrientation !== 'undefined') console.log(oldOrientation);
    let oldOrientation = orientation;
    //other code
}

这会抛出oldOrientation is undefined。我最终只是简单地删除了let 并开始工作,但我很难完全理解为什么。我认为这与范围界定有关?

我已通过在全局范围内声明 oldOrientation 来解决此问题,我只是想了解为什么 typeof 的比较没有按照原来的方式工作。

【问题讨论】:

  • 因为你在函数内部定义它而不是让它成为全局。
  • 但是无论如何,不​​应该比较返回"undefined",从而不会抛出错误吗?
  • 吊装......

标签: javascript scope undefined declaration typeof


【解决方案1】:

From MDN let:

在 ECMAScript 2015 中,let 绑定不受变量提升的约束, 这意味着 let 声明不会移动到 当前执行上下文。引用块中的变量 在初始化导致 ReferenceError 之前(与 用 var 声明的变量,它只有未定义的值)。 变量从块开始就处于“时间死区” 直到初始化处理完毕。

表示您在定义变量之前使用了它。


如果你习惯使用var,那么var 声明会因为提升而移动到块作用域的顶部。所以下面的函数

function foo() {
  console.log(typeof bar)
  var bar = "123";
}

被视为

function foo() {
  var bar;
  console.log(typeof bar)
  bar = "123";
}

但是当您使用let 时,它们没有提升,因此声明不会移动到块的顶部。

【讨论】:

  • 有点帮助,但这是否意味着 Chrome 错误地处理了错误?
  • 我在 chrome 中运行它并得到 "message": "Uncaught ReferenceError: oldOrientation is not defined", 所以看起来它正确地返回了错误消息。
  • @epascarello javascript noob 在这里,我来自 c#,很难理解你在说什么。所以基本上问题是 let 没有使用变量提升,因此如果你用 let 声明变量,那么 if 语句没有意义?但是使用var 就可以了吗?
  • developer.mozilla.org/en-US/docs/Glossary/Hoisting 在 C# 世界中,您将无法编译在声明之前使用了变量的文件。这就是 let 发生的情况
  • @epascarello 是的,我会说这是使用强类型语言的好处,您根本不必担心这个 xD。但只是澄清一下,因为不幸的是世界正在转向 javascript 而不是 C#,所以使用 let 实际上就像是针对此类问题的防御机制?
【解决方案2】:

想象一下这个简化的案例:

let a = 1;

{
 alert(a);
 let a = 2;
}

然后alert(a) 会做一个变量查找。这从当前范围(块)开始,它声明了自己的变量 (let a) 但尚未设置 (a = 2),因此尚未定义。上等于:

let a = 1;

{
 let a /* = undefined */;
 alert(a);
 a = 2;
}

(在代码执行之前声明的变量称为hoisting...)

【讨论】:

  • 这是一个很好的答案,不过你应该提到提升,并可能指向一个资源来了解更多关于 JS 中的提升
  • 对不起,但是你是说由于提升,在比较的时候,变量被声明了,但是当它试图记录它时,它是未定义的?
  • @不是说是的。声明变量时,将其设置为未定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2017-09-06
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-02-12
相关资源
最近更新 更多