关于var、let、const的故事
对于一门编程语言来说,变量与常量是再正常不过的两种,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的故事的更多相关文章
- let、var、const声明的区别
前言 看了方应杭老师的一篇解释let的文章,对JavaScript中的声明有了深刻的理解,这里也就有了总结一下JavaScript中各种声明之间区别的这篇文章. JavaScript中变量声明机制 首 ...
- var let const 的区别
Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...
- ES6和ES5变量声明的区别(var let const)
// es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...
- var和const和let的区别
简述: 1.前端的变量申明,可以用到var,ES6的const(衡量)/let(变量) 2.在ES5用的都是var,到ES6之后,也就是2015年开始出现const/let. var 不会报错,有声明 ...
- let、var、const区别(表格比较)
let.var.const区别(表格比较): 区别项 let var const 作用域 块级作用域 全局作用域或函数作用域 块级作用域 是否有变量提升 无 有 无 是否可重复声明 不可 可以 不可 ...
- var let const的一些区别
var let const 都是来定义变量的. var let 作用域有些区别. const 类似于java中的常量的概念.即:只能给一个变量赋值一次,即指定一个引用. 举例来说: function ...
- javascript中var let const三种变量声明方式
javascript中var let const三种变量声明方式 1.var ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...
- es6(var,let,const,set,map,Array.from())
1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function ...
- let、var、const用法区别
1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123 2.let let 声明 ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
随机推荐
- C#WebService服务在Windows7的部署
(一)C#WebService服务在Windows7的部署 一.在控制面板,程序与卸载中安装IIS组件. 二.IIS无法显示WebService的.asmx文件.解决办法:注:(这里可以不用考虑,直 ...
- [laravel]malformed header from script 'index.php': Bad header: HTTP/1.1 302 Found, referer: http://localhost/auth/login
修改php.ini中的 cgi.rfc2616_headers = 0 cgi.force_redirect = 1
- vscode 同步配置
按照插件完成配置之后,将token保存在本地,编辑配置文件:ctrl+3.sync高级选项.编辑本地扩展设置.将token粘贴进去即可,团队所有vscode均应该按照此配置来保持统一:
- python3 小工具
扫描IP的端口是否开放:Porttest.py # -*- coding: utf-8 -*- import sys import os import socket #扫描 def scanport( ...
- 手把手JDK环境变量配置
分为下载,配置,验证三个步骤解释如何进行JDK环境变量配置. 步骤一: 首先查看配置成功后的效果: tip:点击win——>运行(或者使用win+r,或者shift+鼠标右键打开powershe ...
- 前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js
目的: 模块化开发,组件化开发,让代码符合开发规范,更高效 webpack作用:从pack,就知道这是包的意思,比较专业点叫做前端自动化打包构建工具,代码错误检查,预处理,文件合并(打包),代码压缩 ...
- python argparse sys.argv
python argparse sys.argv class WeiLearningArgumentParser(argparse.ArgumentParser): def __init__(self ...
- vim 多窗口操作
1.打开多个窗口打开多个窗口的命令以下几个:横向切割窗口:new+窗口名(保存后就是文件名) :split+窗口名,也可以简写为:sp+窗口名纵向切割窗口名:vsplit+窗口名,也可以简写为:vsp ...
- AJAX----注:借鉴
Ajax的工作原理. Ajax的核心是JavaScript对象XmlHttpRequest.该对象在Internet Explorer5首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpR ...
- 架构3(基于LVS LB集群解决方案一:piranha)
1.实现调度器的HA 2.对realserver做健康检测 3.动态维护IPVS路由表 pulse 活跃和备用lvs路由器中都会运行pulse守护进程,在备用路由器中,pulse向活跃的服务器的公共接 ...