关于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显得没有必要了,心疼它几秒

//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]

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

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

let 与 const的区别:

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

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

原文地址:https://www.cnblogs.com/Jomsou/p/9161736.html

时间: 2024-10-10 20:48:04

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

var let const 的区别

Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2.var不存在暂时性死区,而let存在,只要块级作用域内存在let,它所声明的变量就绑定了这个区域,不在受外部的影响 例如:var tem=123: if(true){ tem='abc';   //报错 ReferenceError,因为在if里声明了let,形成了自己的作用域,外部的访问不到,所以

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

1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function fn(){ console.log(num); // undefined var num = 46; console.log(num) // 46 } fn() </script> //为什么第一个输出值会是undefined,而不是123呢?因为这里存在着变量名的提升,其实上述语句相当于: &l

var、const、let 的区别

定义变量的三种方式 var.const.let 都可以用来定义变量,但三者之间存在区别. var var 声明变量的时候无需初始化. var 声明的变量可在后面进行修改. var 声明的全局变量可以被函数修改. <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript">

ES6中var/let/const的区别

最近无聊看了一下前端面试题,看到不少地方要求列出var/let/const的异同,自己整理一下,算加深一下记忆. 1.作用域 var为全局作用域,而let和const为局部作用域(仅作用在大括号内),举个简单例子: 1 if(true){ 2 var a = 1 3 let b = 2 4 const c = 3 5 } 6 console.log(a) //a打印出来为 1 7 console.log(b) //b is not defined 8 console.log(c) //c is

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

// es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name="aa"; for(var i=1;i<7;i++){ console.log(i); } console.log(i);//8,不会报错因为var声明的变量没有块级作用域 /** * 总结 var 声明的变量,声明语句会提到作用域的最前面,并且没有块级作用域 */ console.log(

2-新的变量声明方式(var ,let,const)

以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种声明方式了. 字面理解ES6的三种声明方式: var:它是variable的简写,可以理解成变量的意思. let:它在英文中是“让”的意思,也可以理解为一种声明的意思. const:它在英文中也是常量的意思,在ES6也是用来声明常量的,常量你可以简单理解为不变的量 --var声明---- var在ES6里是用来升级全局变量的,我们可以先作一个最简单的实例,用var声明一个变量a,然后用console.

let、var、const的区别

先看let和var: 1. console.log(a); // undefined var a = 3; console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization let a = 3; 在当前代码执行之前,首先会把所有带var关键字的进行声明(带function关键字的也会提前声明并且定义),即所谓的变量提升,let则不存在这种情况. ps:项目中创建函数,一般都是基于函数表达式来实现

请问微信小程序let和var以及const有什么区别

在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文本查看 复制代码 ? 1 2 3 4 5 for(var i=0;i<=1000;i++){ var sum=0; sum+=i; } alert(sum); 声明在for循环内部的sum,跳出for循环一样可以使用,不会报错正常弹出结果 let:声明块级变量,即局部变量. 在上面的例子中,跳出fo

var / let / const

1.var在声明所在的函数作用域内有效.  function(){}  let与const都是只在声明所在的块级作用域内有效.{} 2.var与let声明的变量可以改变,值和类型都可以改变,没有限制. const声明的常量不得改变值,这意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值,且不能重复赋值. const a; // 报错,一旦声明变量,应该立即赋值!! const b = 10; b = 20; // 报错,因为定义常量之后不能重新赋值!! 3.对于复合类型的变量,如