有人可以解释为什么这不起作用吗?
setOrientation: function() {
if (typeof oldOrientation !== 'undefined') console.log(oldOrientation);
let oldOrientation = orientation;
//other code
}
这会引发oldOrientation is undefined
。我最终只是删除let
并开始工作,但我很难完全理解原因。我认为它与范围界定有关吗?
我已通过在全球范围内声明oldOrientation
来修复此问题,我只是想了解为什么typeof
的比较不是按原样进行的。
答案 0 :(得分:4)
在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 ...)