Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于let在ES6中作为全局变量的问题_Javascript_Function_Object_Ecmascript 6 - Fatal编程技术网

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。