Ecmascript 6 为什么使用let会导致代码块中未定义?

Ecmascript 6 为什么使用let会导致代码块中未定义?,ecmascript-6,Ecmascript 6,在代码块中运行代码时,会导致“未定义”,然后使用“this”引用代码块中的局部变量 奇怪的是,当删除同一块中的'this'关键字时,打印效果很好 让productId=12; 如果(真){ 设productId=10 console.log(this.productId)//结果为“未定义” log(this)//结果为{} console.log(productId)//结果为“10” } 给人的印象是“this.productId”将直接引用真实代码块中的productId “this”引

在代码块中运行代码时,会导致“未定义”,然后使用“this”引用代码块中的局部变量

奇怪的是,当删除同一块中的'this'关键字时,打印效果很好

让productId=12;
如果(真){
设productId=10
console.log(this.productId)//结果为“未定义”
log(this)//结果为{}
console.log(productId)//结果为“10”
}
给人的印象是“this.productId”将直接引用真实代码块中的productId

“this”引用代码块中的局部变量

那永远不会发生。如果“本地”和“全球”碰巧是一样的话,情况就是这样

在这里,您可以看到在全局范围内使用
var
时它的行为

var foo=“全局”;
函数myFunction(){
var foo=“本地”;
console.log(this.foo);
}
myFunction()
“this”引用代码块中的局部变量

那永远不会发生。如果“本地”和“全球”碰巧是一样的话,情况就是这样

在这里,您可以看到在全局范围内使用
var
时它的行为

var foo=“全局”;
函数myFunction(){
var foo=“本地”;
console.log(this.foo);
}

myFunction()
与您所在的代码块无关。@tkausl-
是代码块中的
窗口
,如果
let
was
var
将在
窗口
对象上创建一个属性。
与您所在的代码块无关。@tkausl-
是代码块中的
窗口
,如果
let
was
var
将在
窗口
对象上创建一个属性。非常感谢,使用下面的代码更改进行了一些测试。通过将this.id='foo'添加到我问题中的代码中,第二个console.log(this)确实显示了它的引用{id:'foo'}。非常感谢,使用代码中的以下更改进行了更多的测试。通过将this.id='foo'添加到我问题中的代码中,第二个console.log(this)确实显示了它的引用“{id:'foo'}”。