var

如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域。

let
1、let 声明的变量具有块作用域的特征。
2、在同一个块级作用域,不能重复声明变量。
  function foo(){
    let a = 1;
    let a = 2;//Uncaught SyntaxError: Identifier 'a' has already been declared
  }

3、let 声明的变量不存在变量提升,换一种说法,就是 let 声明存在暂时性死区(TDZ)。

  for (var i = 0; i < 5; i++) {
    setTimeout(function(){
      console.log(i);
    },100)
  };
会打印4个4 :setTimeout是异步执行的,100毫秒后向任务队列里添加一个任务,只有主线上的全部执行完才会执行任务队列里的任务,所以当主线程for循环执行完之后 i 的值为5,这个时候再去任务队列中执行任务,i全部为5;每次for循环的时候setTimeout都会执行,但是里面的function则不会执行被放入任务队列,因此放了5次;for循环的5次执行完之后不到1000毫秒;1000毫秒后全部执行任务队列中的函数,所以就是输出五个5啦

  for (let i = 0; i < 5; i++) {
    setTimeout(function(){
      console.log(i);
    },100)
  };
会打印0,1,2,3,4:假如把var换成let,那么输出结果为0,1,2,3,4;因为let i 的是区块变量,每个i只能存活到大括号结束,并不会把后面的for循环的 i 值赋给前面的setTimeout中的i;而var i 则是局部变量,这个 i 的生命周期不受for循环的大括号限制;

const

声明方式,除了具有 let 的上述特点外,其还具备一个特点,即 const 定义的变量,一旦定义后,就不能修改,即 const 声明的为常量。

const obj = {a:1,b:2};
console.log(obj.a);//1
obj.a = 3;
console.log(obj.a);//3

所以准确的说,是 const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。

最新文章

  1. SlickGrid example 4: 过滤
  2. delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
  3. hive sql 语法详解
  4. oracle object_id和data_object_id的区别
  5. springMVC+ freemark多视图配置
  6. 整理QTP知识之1
  7. 【Swift】IOS开发中自定义转场动画
  8. OJ题:将一个数倒置输出
  9. Teamviewer远程ssh命令行更改密码启动
  10. eclipse、myeclipse写类时,自动生成注释
  11. Java并发之线程池ThreadPoolExecutor源码分析学习
  12. install virtualenv
  13. Final发布 视频展示
  14. Dynamics CRM 2015 Update 1 系列(4): 自己定义主键 - Alternate Keys
  15. js判断浏览器内核和版本(包括手机端设备)
  16. c#:使用using关键字自动释放资源未必一定就会有明显好处
  17. tornado.gen 模块解析
  18. bzoj 3672 购票 点分治+dp
  19. Storm(一)Storm的简介与相关概念
  20. linux Valgrind使用说明-内存泄漏

热门文章

  1. yii2.0复选框默认选中
  2. Object-c学习笔记(1)
  3. C#常用多线程方法
  4. 对XAML进行编辑的辅助类(XamlHelper)
  5. jquery validate 详细说明
  6. 移动端--web开展
  7. 跟我学ASP.NET MVC之九:SportsStrore产品管理
  8. 从 RNN 到 LSTM (Short-Term Memory)
  9. 正态分布(normal distribution)与偏态分布(skewed distribution)
  10. QT实现鼠标钩子(使用SetWindowsHookEx安装mouseProc函数)