以前无论声明变量还是常量,总是使用var一勺端,知道接触了es6之后,发现原来变量、常量的声明其实是很讲究的。

  这里简单来谈谈var、const与let。

  1、var。var声明的变量没有块级作用域,而且存在变量名提升的情况。这里举例说明。

<script>
var num = 123;
function foo(){
console.log(num); // undefined
var num = 46;
console.log(num) //
}
foo()
</script>

  为什么第一个输出值会是undefined,而不是123呢?因为这里存在着变量名的提升,其实上述语句相当于:

<script>
var num = 123;
function foo(){
var num;
console.log(num); // undefined
num = 46;
console.log(num) //
}
foo()
</script>

  上面主要体现了var存在着变量名的提升,那么它没有块级作用域又是怎么体现的呢?最常见的是在条件语句里面,如if语句、for语句。这里以if语句为例。

<script>
var num = 123;
if(true){
console.log(num) //
   var num = 456;
console.log(num) //
}
console.log(num) //
</script>

  这里为什么第一个输出值不是undefined,第三个输出值不是123呢?原因是这样的,因为var不存在块级作用域,且变量名会提升,所以上述代码其实相当于:

<script>
var num;
num = 123
if(true){
  console.log(num) //
  num = 456;
  console.log(num) //
}
console.log(num) //
</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); //
}
console.log(num) //
</script>

  可见在if语句内声明的常量在if语句外并不能访问到,这里与var不同。这里是以if语句为例的,当然在for语句亦或是函数内都是这样的,存在着块级作用域

  

  3、let(es6中用来定义变量的一个关键字)。let定义的变量存在着块级作用域,在函数内定义的变量,对函数外部无影响。

  (1)、在函数内部定义的变量,对函数外部无影响,即存在着块级作用域。  

<script>
let num = 789;
function foo(){
let num = 46;
console.log(num) //
}
foo()
console.log(num) //
</script>

  (2)、不存在着变量名的提升。

<script>
function foo(){
console.log(num); // Uncaught ReferenceError: num is not defined
let num = 46;
console.log(num)
}
foo()
</script>

  运行后发现会报错,可见使用let声明的变量,并不像var那样存在着变量名的提升问题。

最新文章

  1. 使用xmarks同步 chrome ie firefox safari书签
  2. this对象
  3. mac攻略(二) -- 简单配置php开发环境
  4. Unity脚本在层级面板中的执行顺序测试4-附加整理
  5. JQuery Highcharts图表控件多样式显示多组数据
  6. POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)
  7. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
  8. hdu1573:数论,线性同余方程组
  9. Arcgis Runtime sdk for android 授权
  10. I/O浅析
  11. 关于html标签元素的data-*属性
  12. Eclipse设置的断点失效的解决办法
  13. TF30042: The database is full. Contact your Team Foundation Server administrator.
  14. QT 设计师使用样式表添加背景
  15. *Boosting*笔记
  16. python运行js
  17. Android Button四种点击事件和长按事件
  18. html2canvas文字重叠(手机端)
  19. GitHub Desktop 出现“please upgrade your plan to create a new private repository”的解决办法
  20. 【RMAN】RMAN-05001: auxiliary filename conflicts with the target database

热门文章

  1. Linux并发连接上百万的配置
  2. JS中事件绑定的三种方式
  3. axios配合vue+webpack使用
  4. vue2.0的瀑布流组件-使用说明
  5. [编织消息框架][网络IO模型]NIO(select and poll)
  6. Vue 爬坑之路(九)—— 用正确的姿势封装组件
  7. &lt;转&gt;LOG日志级别
  8. SourceTree管理工具的一些使用总结
  9. PowerShell 函数
  10. [SharePoint Online]SharePoint Designer无法打开世纪互联版sp online站点得解决方法,报错信息:请安装更新后再重新打开