var let const声明的区别

var let const声明的区别

var 在ECMAScript的任何版本中都可以使用,而let和const只能在ECMASctipt6及更晚的版本中使用

var 关键字声明

  1. 使用var关键字可以声明任何类型的变量
var a ='abc';
a = 123;

这两条语句 第一条先是声明了一个变量a 里面存放了字符串类型的变量
第二条则改变这个变量的值,由字符串类型abc变成了数值类型123;
虽然不推荐改变变量的类型 ,但这种写法在ECMAScript中是完全有效的

  1. var 声明的作用域

在函数里使用var声明的变量在函数结束之后,变量会被销毁

在函数内部省略关键字var 可以创建一个全局变量(不推荐)

  1. var声明的提升

使用var关键字声明的变量会自动提升到函数作用域的顶部

所以 使用var反复声明一个变量都会在函数执行之前将var声明的变量提到函数顶部一个,所以不会报错。

let 关键字声明

  1. 使用let关键字也可以声明任何类型的变量
let a = 123;

function fn(){
    let b = 345;
    let c =function(){
        console.log('hello!');
    }
    console.log(a);
}
  1. let 声明的作用域

let和var的作用差不多,但是有区别,最明显的区别就是:let声明的范围是块作用域

块作用域 是函数作用域的子集
而var声明的范围是函数作用域

var 声明 范围 函数作用域

function fn(){
    if(true){
        var name = 'hehe';
        console.log(name); //hehe
    }
    console.log(name); //hehe
}

function fn(){
    if(true){
        let name = 'hehe';
        console.log(name); // 输出hehe
    }
    console.log(name); //输出为空
}
  1. let 声明不允许出现冗余声明

同一个块作用域 不能出现重复声明

let a =123;
let a = "1222";// a has already been declared

在不同块之间可以声明同名变量

function fn(){
    let a = "hehe";
    if(true){
        let a = 123;
        console.log(a);  //123
    }
    console.log(a);  //hehe
}

声明冗余不会因混用var 和 let 而受影响 这两个关键字声明的并不是不同类型的变量
它们只是指出变量的相关作用域如何存在

let name = 123;
var name = "222"; // name has already been declared

var name = "222"; 
let name =123; // name has already been declared
  1. let 暂时性死区(let声明的变量不会在作用域中被提升)

在预编译过程中,js引擎也会注意到后面的let声明,但是不会在此之前以任何方式来引用未声明的变量,这就叫let的暂时性死区

function fn(){
    console.log(a); //undefined 声明了 但是未定义

    var a =123;
}


function fn(){
    console.log(a); //错误,根本未声明

    let a =123;
}
  1. let 在全局作用域中声明的变量,不会成为window对象的属性(var声明则会)

不过,let声明仍然在全局作用域中发生的,相应变量会在页面的声明周期内存续,因此,为了避免error,必须确保页面不会重复声明同一变量

var name =123 ;
console.log(window.name); //123

let age = "12222";
console.log(window.age); //undefined
  1. let不能使用条件式声明

使用var声明时,由于声明会被提升,js引擎会将多余的声明在作用域顶部合并为一个声明
因为Let的作用域是块,所以不可能检查前面是否已经使用let声明过同名变量
因为条件块中let声明仅限于该块,所以不能使用条件式声明

try{
    console.log(age);
}
catch(error){
    let age = 111;
    console.log(age); //111
}
// let age 被限制在catch块中
// 所以这个赋值相当于全局赋值
age = 123; //123
  1. For循环中的let声明

在let出现之前,使用var声明 for循环定义的迭代变量会渗透到循环体外部;
js引擎会为for循环中let声明分别创建独立的变量实例。

for(var i = 0;i<5;i++){

}
console.log(i);

使用let之后,这个问题就解决了,因为迭代变量的作用域块仅限于for循环内部

for(var i = 0;i<5;i++){

}
console.log(i); //5,5,5,5,5


for (let i = 0;i<5;i++){
    setTimeout(() => console.log(i),0) //0,1,2,3,4
}

const关键字声明

  1. const行为基本上与let相同,唯一重要的一点就是,const声明时必须要初始化变量,并且尝试修改const声明的变量的值时会导致运行错误

不允许重复声明
声明的作用域也是块

const name = 'hehe';
const name = 123;  // name has already been declared

const name =123;
if(true){
    const name = 'gaga';
}
console.log(name); // 123
  1. const声明的限制只适用于它所指向的变量的引用,换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制
const abc = {

};

abc.name = "abcname"; //abc.name = "abcname"

声明风格

  1. 不使用var 使用let和const已经够了,而且变量有了明确的作用域,声明位置,以及不变的值
  2. const优先,let次之,使用const可以有效的判断那些变量的值永远不会变,同时可以迅速发现意外赋值导致的非预期错误

原文地址:https://www.qianqianhaiou.cn/index.php/archives/58/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `var`、`let`、`const` 都是 JavaScript 中用来声明变量的关键字,但是它们之间有一些区别。 - `var`: 声明的变量可以在声明之前使用,并且默认值为 undefined。 - `let`: 声明的变量只能在声明之后使用,并且不会有默认值。 - `const`: 声明的变量只能在声明之后使用,并且不能被重新赋值。 需要注意的是,const 用于声明常量,声明不能再修改,但是如果声明的是一个对象,那么对象的属性是可以修改的。 ### 回答2: JavaScriptvarletconst是变量声明的三种方,它们有以下区别: 1. var:在函数作用域或全局作用域内声明变量,可以在声明之前使用。同一个作用域内的重复声明会被忽略,变量可被重新赋值。var存在变量提升的特性,在函数作用域中先声明后使用,变量的值为undefined。 2. let:在块级作用域内声明变量,块级作用域是指由一对花括号{}包围的区域。let声明的变量只在所在的块级作用域中有效,不会进行变量提升。同一个作用域内重复声明会报错,变量可被重新赋值。 3. const:也是在块级作用域内声明变量,声明的变量必须进行初始化,且初始化后不能再次被赋值。const声明的变量是常量,不可重新赋值,但如果变量是一个对象或数组,其内部的属性或元素是可以修改的。 总结来说,varlet都可以声明变量,但是let具有块级作用域,而var只有函数作用域或全局作用域,let不存在变量提升。const声明的是常量,不可重新赋值,但是如果是对象或数组,可以修改其属性或元素。在实际开发中,推荐优先使用letconst,避免使用var。 ### 回答3: JavaScript中的变量声明有三种方varletconst。它们在作用域、声明提升、重新赋值和暂时性死区等方面有所不同。 首先,var声明的变量的作用域是函数作用域,而letconst声明的变量的作用域是块级作用域。块级作用域是指由一对花括号{}包围的区域,例如if语句、循环语句和函数等。在块级作用域外部无法访问块级作用域内部声明的变量。 其次,var声明的变量存在声明提升的特性,即在变量声明之前就可以访问到变量,但其值为undefined。而letconst声明的变量不存在声明提升,即无法在声明之前访问到变量。 再次,var声明的变量可以被重新赋值,而let声明的变量也可以被重新赋值,但const声明的变量是常量,不能被重新赋值。这意味着const声明的变量必须在声明进行初始化,并且在后续的代码中不能再次给它赋值。 最后,letconst声明的变量存在暂时性死区的概念。暂时性死区指的是在块级作用域内,使用letconst声明的变量在声明之前无法被访问。这是由于变量在进入块级作用域时就已经被创建,并且在声明之前访问变量会引发错误。 综上所述,varletconst在作用域、声明提升、重新赋值和暂时性死区等方面有所不同。可以根据具体的需求选择合适的变量声明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值