一、问题在学习js的过程中,很多小伙伴都会了解变量的知识点。实际上,每个变量只是一个占位符,以便更好地表达数据。在ECMAScript中,有3个关键字来声明变量:var、const和let。但是为什么简单的变量声明需要三个关键字呢?它们的相同点和不同点是什么?2.出现时间上的差异通过查询资料,我们发现let和const这两个变量只能在ES6及以后的版本中使用,而var在ES的所有版本中都可以使用。个人理解是let和const这两个变量是对var缺点的补充。三、三者的区别省时,先说结果再说原因!!var全局作用域,函数作用域。在同一个作用域下,同一个变量可以声明多次(可以在后续代码中重新赋值)。可以在声明之前调用(先调用再声明)。let作用域:全局作用域、函数作用域、块级作用域。在同一个作用域下,同一个变量不能声明多次。不能在声明前调用。const作用域:全局作用域、函数作用域、块级作用域。在同一个作用域下,同一个变量不能声明多次。不能在声明前调用。可以看出const的行为与let基本相同。唯一重要的区别是变量在用于声明变量时必须同时初始化,而试图修改const声明的变量会导致运行时错误。而var只能在全局范围和函数范围内使用。刚才提到了一个名词叫块级作用域,指的是作用域:循环判断同一层级的东西{}下面来详细解释一下这几个关键字吧~~4.关键字详解var关键字1.1var关键字这里是显示var的功能范围。方法中声明的var变量仅在方法内部有效。函数测试(){vara="hi";//局部变量}test();控制台日志(一);//错误!解决这类问题,可以把var变量去??掉,直接定义一个全局变量,如下。但是一般不推荐这样做,会造成混乱和维护麻烦。函数测试(){a=“你好世界”;//局部变量}test();控制台日志(一);//"helloworld"1.2var语句的提升看起来怪怪的,在scope内先输出变量,再定义form,在Js中不会报错,因为声明的变量会自动在最前面提到功能范围。例如:functionfoo(){console.log(score);变量得分=26;}foo();//undefined代码中,先输出score,再赋值。这是因为ES在运行时,所有用关键字var声明的变量都会自动放在最前面。但此时未分配。所以输出undefined。在处理过程中,ES将上面的代码等同为:varscore;控制台日志(分数);分数=26;}foo();//undefined这是var提升的声明letkeyword1.letkeywordScope说到let,就免不了要提到块级作用域。上面说了,可以大致理解为统一{}中的内容。编写代码并运行它。//首先,我们可以先写一个var,比较一下if(true){varname="小田"console.log(name)//"小田"}console.log(name)//"小田"//什么此时是否使用let?if(true){letname="xiaotian"console.log(name)//"xiaotian"}console.log(name)//ReferenceError.ageisnotdefined这说明let只在代码范围内起作用。而var可以全局发挥作用。值得注意的是,这里使用的是if语句,并不是上面提到的函数作用域function()。这样var定义的值就可以传出去了。值得注意的是,let和var的作用域不同,即函数是嵌套的,let和var可以重复定义。2.声明var的作用域会成为windows对象的一个??属性,而let不会。3.条件前面说了,var声明的变量可以在顶层提升和定义。但是let只作用于块作用域,无法检查同一个变量是否已经用let声明过。也不能在声明前调用。const关键字这个关键字和let很像,但是在循环过程中有一个报错形式,因为迭代变量会自己增加:for(consti=0;i<10;++i){}//TypeError:给常量赋值综上所述,var在使用过程中很容易出问题,因为它的范围太广了。let和const就好多了,也更容易定位错误。
