Javascript 关于let在ES6中作为全局变量的问题
如下面的代码所示,我使用了Javascript 关于let在ES6中作为全局变量的问题,javascript,function,object,ecmascript-6,Javascript,Function,Object,Ecmascript 6,如下面的代码所示,我使用了var value=1,得到的值是1。我可以理解这一点,因为返回这个.value这里this指向窗口,所以我可以打印出全局变量值 var值=1; 设obj={ getValue:function(){ 返回函数(){ 返回此.value; } } } console.log(obj.getValue()());//1来自: let允许您声明在其上使用的块、语句或表达式的范围内受限的变量。这与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不考虑块范围
var value=1
,得到的值是1。我可以理解这一点,因为返回这个.value
这里this指向窗口,所以我可以打印出全局变量值
var值=1;
设obj={
getValue:function(){
返回函数(){
返回此.value;
}
}
}
console.log(obj.getValue()());//1
来自:
let允许您声明在其上使用的块、语句或表达式的范围内受限的变量。这与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不考虑块范围
以及:
在程序和函数的顶层,与var不同,let不在全局对象上创建属性。例如:
在程序和函数的顶层,与var不同,let不
在全局对象上创建属性。例如:
var x='global';
设y=‘全局’;
console.log(this.x);//“全球”
console.log(this.y);//未定义
,因为let
不会向全局窗口
对象添加任何内容-这就是动态变量名称如下所示的原因:
var dynamicR=“你好,世界!”;
log(这个[“dynamic”+“R”])代码>为:
与var
不同,在程序和函数的顶层,let
不在全局对象上创建属性
这是因为let
总是创建一个词汇范围的变量。如果改为创建全局对象的属性,则这些属性对于其他范围中的代码是可见的。它们将不再是词汇范围,不再使用let
如果您想知道如何在全局范围内不包含词汇上的“其他范围”,那么可以有多个脚本文件。或者看看你的例子:
let getValue=function(){
返回此.value;
};
设值=1;
log(getValue())
那么如果不在窗口中,那么让dynamicR定义在哪里?@abelito,它存储在环境(读取全局)记录中,而不是环境对象中。我对此也很困惑。需要注意的是,它应该是使用var的一种替代方法,所以您可以使用let和const或var。它们被创建为var的替代方法。如果您不想更改var,您可以使用const。如果希望var根据其在文档中的位置进行更改(如上面的块、语句或表达式所述),可以使用let。