检查typeOf undefined不起作用?

时间:2017-08-24 16:04:26

标签: javascript scope undefined declaration typeof

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

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

这会引发oldOrientation is undefined。我最终只是删除let并开始工作,但我很难完全理解原因。我认为它与范围界定有关吗?

我已通过在全球范围内声明oldOrientation来修复此问题,我只是想了解为什么typeof的比较不是按原样进行的。

2 个答案:

答案 0 :(得分:4)

From MDN let:

  

在ECMAScript 2015中,让绑定不受可变提升的影响,   这意味着让声明不会移动到顶部   当前执行上下文。引用块中的变量   在初始化之前导致ReferenceError(与a相反)   用var声明的变量,它只有未定义的值)。   变量位于"临时死区"从块的开始   直到初始化处理完毕。

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

如果您曾经使用var,那么由于提升,var声明会移动到块范围的顶部。所以以下功能

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

被视为

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

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

答案 1 :(得分:2)

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

let a = 1;

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

然后警报(a)将执行变量查找。从当前作用域(块)开始,该作用域声明了自己的变量( let a )但尚未设置( a = 2 ),因此尚未定义。上限等于:

let a = 1;

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

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