浅析const、let与var
以前无论声明变量还是常量,总是使用var一勺端,知道接触了es6之后,发现原来变量、常量的声明其实是很讲究的。
这里简单来谈谈var、const与let。
1、var。var声明的变量没有块级作用域,而且存在变量名提升的情况。这里举例说明。
<script> var num = 123; function foo(){ console.log(num); // undefined var num = 46; console.log(num) // 46 } foo() </script>
为什么第一个输出值会是undefined,而不是123呢?因为这里存在着变量名的提升,其实上述语句相当于:
<script> var num = 123; function foo(){ var num; console.log(num); // undefined num = 46; console.log(num) // 46 } foo() </script>
上面主要体现了var存在着变量名的提升,那么它没有块级作用域又是怎么体现的呢?最常见的是在条件语句里面,如if语句、for语句。这里以if语句为例。
<script> var num = 123; if(true){ console.log(num) // 123 var num = 456; console.log(num) // 456 } console.log(num) // 456 </script>
这里为什么第一个输出值不是undefined,第三个输出值不是123呢?原因是这样的,因为var不存在块级作用域,且变量名会提升,所以上述代码其实相当于:
<script> var num; num = 123 if(true){ console.log(num) // 123 num = 456; console.log(num) // 456 } console.log(num) // 456 </script>
所以在我看来,var其实是有利有弊的,利就是不用去管什么常量与变量的,直接使用var就行,弊就是不存在块级作用域且变量名会提升,这会在无形之中给我们带来许多意想不到的问题
2、const(es6中用来定义常量的一个关键字(当然了,其他语言里也存在着const,这里仅指在js中)。常用来声明常量,且常量不可修改,必须初始化,存在着块级作用域。
(1)、不存在名称提升问题。以代码说事儿。
<script> function foo(){ console.log(num); const num = 456; console.log(num) } foo() </script>
运行上述代码会发现会报错 Uncaught ReferenceError: num is not defined 。这里说明,使用const来定义的常量名并没有提升。
(2)、声明时必须初始化。假如用const声明的常量并没有初始化呢?会有问题吗?直接上代码
<script>
const num;
console.log(num)
</script>
这里运行后发现会报错。 Uncaught SyntaxError: Missing initializer in const declaration 意思是:语法错误,在const声明中没有初始化。
同样的代码,只是const声明初始化,结果会不会有变化呢?答案是不言而喻的了。
(3)、存在着块级作用域。什么叫块级作用域呢?上代码:
<script> const num = 456 if(true){ const num = 789; console.log(num); // 789 } console.log(num) // 456 </script>
可见在if语句内声明的常量在if语句外并不能访问到,这里与var不同。这里是以if语句为例的,当然在for语句亦或是函数内都是这样的,存在着块级作用域
3、let(es6中用来定义变量的一个关键字)。let定义的变量存在着块级作用域,在函数内定义的变量,对函数外部无影响。
(1)、在函数内部定义的变量,对函数外部无影响,即存在着块级作用域。
<script> let num = 789; function foo(){ let num = 46; console.log(num) // 46 } foo() console.log(num) // 789 </script>
(2)、不存在着变量名的提升。
<script> function foo(){ console.log(num); // Uncaught ReferenceError: num is not defined let num = 46; console.log(num) } foo() </script>
运行后发现会报错,可见使用let声明的变量,并不像var那样存在着变量名的提升问题。
作者:江峰★
出处:http://www.cnblogs.com/jf-67/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?