序
众所周知,ES5之前的javascript语言只有函数作用域和全局作用域,而var是用来声明变量的,这让人们对var声明的变量仍然有变量提升感到困惑。我们先回顾一下ES5的var语句,然后比较Let和const。
定义变量
var声明的函数范围和全局范围。
来到代码体验:
函数getName(){ if(1 1===2){ var name=' Xixi ';} console.log(名称);} getName();//xixi在C或java语言中,名称应该只在if块中使用,但也可以在if之外访问,这是js没有块级作用域的表现。这个缺点在for循环中非常明显:
for(var I=0;i 10i ) { //.} console . log(I);//10var我原本打算声明一个临时变量I,用来遍历数组等。它不应该在for循环之外被访问,但是现在可以被访问了。你觉得很烦吗?一个更好的程序员会通过立即执行函数来模拟块级作用域,但我会注意尽可能不使用相同的变量名。
(function(){ for(var I=0;i 10i ) { //.}})();console . log(I);//未定义以上:众所周知,js没有块级作用域。
变量可以重复声明
var name=' xixiconsole.log(名称);//xixivar name='一步';console.log(名称);//不要一步报错,也不要迷茫。这意味着变量可以重复声明。
可变促销
函数getName(){ console . log(name);var name=' xixi//.} getName();//undefinedconsole.log打印名称未定义。为什么不报告错误?这种现象对于一直使用js语言的人来说很容易理解,估计从后台转到前端的人都要骂人。这叫做变量提升。让我简单地给你解释一下。
var name=' xixi这是我们写的一个烂语句,包括两个过程:var name名称=' xixi分别声明和初始化变量。
变量提升:不考虑变量声明var名称;在任何位置,它都会被提到范围的顶部。
让
为了使变量的生命周期更加可控,ES6引入了两个非常好的特性,let和const。块级作用域、不可重复声明和临时死区用于解决var变量的各种问题。
块级范围
函数getname 4 es6(){ if(1 1===2){ let name=' Xixi ';} console.log(名称);} getname 4 es6();//未定义最后,您不能访问{}以外的名称。for循环也变得简单了。让我们尝试将for循环的var更改为let。
变量不能在同一个块级范围内重复声明
函数redefineValue(){ let name=' Xixi ';让名字='一步';} redefineValue();//语法错误:不清楚标识符' name '已经声明重复的语句将报告错误
{ let name=' xixiconsole.log(名称);//Xixi { let name=' yibu ';console.log(名称);//yibu }}注意:{}是ES6中的块级作用域。
暂时死区
函数getname 4 es6(){ console . log(name);for(设I=0;i 10I){ } let name=' Xixi ';//.} getname 4 es6();//未定义引用错误:名称。在上面的ES5中,会有名称上的变量提升,值是未定义的。ES6中再次报告错误。怎么解释?这就是临时死区的概念。在作用域块中,不能在声明变量之前使用变量。如果你使用它们,你会犯错误。
当javascript引擎发现变量声明时,它要么将变量声明提升到作用域的顶部(当var声明变量时),要么将变量置于临时死区(当let和const声明变量时)。访问临时死区中的变量将触发运行时错误。
常数
Const和let也有块级作用域,不能重复声明,还有临时死区的概念。它还有两个独特的特点:必须在声明的同时初始化,变量引用不能改变。
必须在声明的同时初始化
常量名称;//语法错误:不清楚如果没有赋值,const声明中缺少初始值设定项将会报告错误。这也很容易理解,const旨在定义常量和不可变的值。如果申报时不给出初始值,就没有机会了。
该值是不可变的
const name=' x9x9名称=' yyy//不清楚的语法错误:无效或意外的标记。对象呢?
const person={ name: 'lala ',age : 40 };person={ };//vm1042:6不清楚类型错误:常量变量赋值。在匿名:633608引用是不可变的,那么我们来看看对象的属性值是什么~
person.name=' yoyoconsole . log(person);//{name: 'yoyo ',age: 40}未报告任何错误,无法更改对象引用,并且可以更改对象属性。
let vs const
你可能会搞不清楚什么时候用let,什么时候用const。Const似乎可以做任何让他能做的事情。网上有一个流行的做法:如果你会用const,就永远不会用let。它简单粗暴,但很容易使用。
个人观点:如果变量在后续的方法中会发生变化,就用let。有些常量声明使用const,const声明的变量名全部大写。代码中的一个变量,如果用字母声明,意味着它是可变的;如果由const声明,不要更改它的值,无论它是简单数据类型还是引用类型变量。这样,程序会更健壮,大家配合起来也会更方便。
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。