对于一门编程语言来说,变量与常量是再正常不过的两种,JavaScript是一直解释型的弱类型语言。

JavaScript中变量或者常量可以用var、let、const(后两者是ES6的新特性)。

1.let、const基本用法

只在声明所在的块级作用域内有效

{
let a = 1;
var b = 1;
const c = 1;
}
a//Uncaught ReferenceError: a is not defined
b//1
c//Uncaught ReferenceError: c is not defined

2.有块级作用域

一般在for循环中使用

经典案例:

ES6以前

for(var i=0;i<4;i++){
setTimeout(function(){
console.log(i);
},30)
} //4 4 4 4

当然了,这种情况也是有解决的办法的。

 for (var i=1; i<=4; i++) {
(function(j){
setTimeout( function timer(){
console.log( j );
}, 1000 );
})( i );
}

IIFE显得没有必要了,心疼它几秒(相当于用var来实现let的块级作用域)

//IIFE

(function(){
var tmp = ...;
...
})();

//ES6

{
let tmp = ...;
...
}

3.不存在变量提升

console.log(a);
let a = 1; //Uncaught ReferenceError: a is not defined

而ES6之前

console.log(a);
var a = 1; //undefined

4.不允许重复声明

let a = 1;
let a = 2;//Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 2;
const b = 3;//Uncaught SyntaxError: Identifier 'b' has already been declared

而ES6之前

var a = 1;
var a = 2;//2
var b = 2;
var b = 3//3
function func(arg){
let arg;//error
}

VS

function func(arg){
{
let arg;//ok
}
}

5.暂时性死区

ES6明确规定,如果区块存在let或者const,则区块对这些变量从一开始就形成了封闭的作用域。只要在声明之前就使用这些变量,就会报错。

var tmp = 123;
if(true){
tmp = 'abc';//ReferenceError
let tmp;
}

上面的代码中存在变量tmp,但块级作用域内let有声明了一个局部变量tmp,导致后者绑定了这个块级作用域,所以在let声明前使用这些变量,就会报错。

TDZ(temporal dead zone, 简称TDZ)

if(true){
//TDZ开始
tmp = abc';//ReferenceError
console.log(tmp);//ReferenceError let tmp;//TDZ结束
console.log(tmp);//undefined
}

容易忽略的暂时性死区

function bar(x=y,y=2){
return [x, y];
}
bar();//报错

相反:

function bar(x=2,y=x){
return [x, y];
}
bar();//[2,2]

6. 当全局声明变量时,var是挂载到global,let和const是挂载在script上

为什么ES6规定暂时性死区和变量提升?

主要是减少运行时错误,防止在变量声明前使用这个变量,从而导致意料之外的行为。

let 与 const的区别:

let用于声明变量,const只能声明常量,一旦声明,其值不可改变。

原文链接:https://github.com/Zenquan/blog/issues/2

关于var、let、const的故事的更多相关文章

  1. let、var、const声明的区别

    前言 看了方应杭老师的一篇解释let的文章,对JavaScript中的声明有了深刻的理解,这里也就有了总结一下JavaScript中各种声明之间区别的这篇文章. JavaScript中变量声明机制 首 ...

  2. var let const 的区别

    Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...

  3. ES6和ES5变量声明的区别(var let const)

    // es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...

  4. var和const和let的区别

    简述: 1.前端的变量申明,可以用到var,ES6的const(衡量)/let(变量) 2.在ES5用的都是var,到ES6之后,也就是2015年开始出现const/let. var 不会报错,有声明 ...

  5. let、var、const区别(表格比较)

    let.var.const区别(表格比较): 区别项 let var const 作用域 块级作用域 全局作用域或函数作用域 块级作用域 是否有变量提升 无 有 无 是否可重复声明 不可 可以 不可 ...

  6. var let const的一些区别

    var let const 都是来定义变量的. var let 作用域有些区别. const 类似于java中的常量的概念.即:只能给一个变量赋值一次,即指定一个引用. 举例来说: function ...

  7. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  8. es6(var,let,const,set,map,Array.from())

    1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function ...

  9. let、var、const用法区别

    1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123  2.let let 声明 ...

  10. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

随机推荐

  1. windows下局域网文件共享,不需要登录账号密码

    基于局域网中,有时候需要传输一个大的文件都需要用到U盘,很麻烦,所以优选文件共享.但是有时候会出现需要登录账户密码,所以需要设置第三步,步骤如下: 1.选中要共享的文件夹,右键有一个共享选项,点击出现 ...

  2. Houdini技术体系 基础管线(二) :Heightfiled与UE4的无缝导入以及对World Composition的支持

    Authored by TraceYang 前言    传统的制作做比较真实大世界3D关卡地形时,通常的采用的方式是把HeightMap和SplatMap(Layer Mask)导入到引擎的地形系统里 ...

  3. ABBYY PDF Transformer+安装教程

    ABBYY PDF Transformer+是一个新的全功能PDF文档工具,涵盖整个文档生命周期所涉及的各项功能,包括创建.讨论.批准.保护.转换成可编辑格式的PDF文件.文件合并.文本和图像的提取等 ...

  4. python sort和sorted区别。

    前者是方法,后者是函数.oop和opp区别的经典体现.好好领会,就能知道什么时候写类什么时候写函数好.

  5. Linux------使用Xfpt6连接阿里云ECS服务器

    1.安装Xftp6,直接下一步到安装完成就可以了 2.新建文件传输 3.新建会话 4.填写会话信息 5.点击“连接”即可

  6. CSS实现自适应九宫格布局 大全

    看到微博和朋友圈都实现了图片九宫格,曾经有次面试也问到了九宫格这个问题,当时想到的是先固定每个单元格的宽高,然后进行浮动.今天想折腾一下,实现自适应父元素宽度的布局.这次我只写了四种方式去实现九宫格, ...

  7. 1.3 flask

    2019-1-3 12:03:55 还是天天看视频,敲代码感觉好! 越努力,越幸运! flask 部分参考连接  https://www.cnblogs.com/wupeiqi/articles/75 ...

  8. jQuery AJAX方法 前台往后台传数据

    https://blog.csdn.net/dreamstar613/article/details/61912717 http://www.cnblogs.com/zhuxiaojie/p/4783 ...

  9. 为 git设置代理

    普通设置 git config --global http.proxy 'socks5://127.0.0.1:1080'git config --global https.proxy 'socks5 ...

  10. linux --mariadb/redis数据库篇

    mariadb ---磁盘型数据库 基础安装 配置好yum源后,软件就可以通过配置的yum源进行安装,按理来讲安装mysql直接通过   yum install mariadb  -y  便可安装,但 ...