let var const理解记录

变量声明包括let  var const

在这之前,需要提一点:

如果一个变量没有声明直接被使用,那该变量自动会变为全局变量。

i = 10; // i现在是全局变量

该缺陷是因为 在js设计之初,为了方便初学者而不要求强制申明变量导致的,

后面推出的strict模式修补了这一问题

在js代码第一行写上:  'use strict

它的作用是在声明了之后,会严格检测该文件内的变量是否通过var申明,若无则报错

它们的区别如下:

对其中的概念解释如下:

1、作用域 

作用域既是该值能够生效,能够被访问的区域范围。

var 为全局作用域,let和const是局部作用域(仅在函数体内可用)

if(true) {
    var a = 1;
    let b = 2;
    const c = 3;
}

console.log(a); // a打印值为1
console.log(b); // b打印值为 undefined
console.log(c); // c打印值为 undefined

2、变量声明

var 和 let可以仅声明不赋值,但是const必须赋值,否则会报错

var a = 1 //正确
let b = 1 //正确
const c = 1 //正确

var d //正确 d打印为undefined
let e //正确 e打印为undefined
const f //错误

3、是否可修改

var 和let声明的变量可随意修改,const声明的变量  若为基础类型(undefined null string number boolean)则不可修改,若为引用数据类型(object array), 可以修改值, 不可修改引用对象。

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

let b = 1;
b = 2;
console.log(b) // 2

//c为基本数据类型不可修改
const c = 1;
c = 2; //报错

//d为引用数据类型
const d = [1,2,3];
d.push(4);//对引用数据类型进行值的修改可进行
console.log(d);// [1,2,3,4]
d[0] = 2; // [2,2,3,4]
d = [1,2,3,4,5] //对引用数据类型进行地址修改,报错

简单来讲 就是const定义的变量  不可以直接修改该变量,若为非基本数据类型,可以修改该变量的值

4、是否可重复声明

var 可重复声明  let和const不可重复声明

var a = 1;
var a = 2; //不报错,可重复声明
console.log(a); // 2

//let 和 const 情况相同
let a = 3;//报错,上面已经声明过a(var 声明的也不可以)
let b = 1;
let b =2; //报错,上面已经声明过b

5、变量 提升

var声明的变量会进行变量提升,但是赋值不提升;let和const声明的变量不会提升。


console.log(v1);
var v1 = 100;
function foo() {
    console.log(v1);
    var v1 = 200;
    console.log(v1);
}
foo();
console.log(v1);

 输出结果为  undefined  undefined 200 100 

为什么呢?

因为这里还有函数提升,

函数声明的优先级是要高于变量声明的   即  function foo() 的声明,在代码执行时会被提到最顶端

单纯的变量提升


function test () {
    console.log(a);  //undefined
    var a = 123; 
};

test();


// 它的实际执行顺序如下

function test () {
    var a;
    console.log(a);
    a = 123;
}
test();


// 即对a的声明被提到了最顶部去执行

 

 

 

 

<think>好的,我现在需要回答用户关于JavaScript中letvarconst的区别及使用场景的问题。首先,我得回顾一下这三个关键字的基本特性差异。 用户可能已经知道这三个关键字都用于变量声明,但具体区别可能不太清楚。我需要从作用域、提升、重复声明赋值等方面展开。首先,var是ES5引入的,而letconst是ES6新增的,这一点需要提到。 作用域方面,var是函数作用域,而letconst是块级作用域。例如,在if语句块中用var声明的变量在块外仍然可访问,但用letconst声明的则不行。这里需要举例子说明,比如: function example() { if (true) { var a = 1; let b = 2; const c = 3; } console.log(a); // 1 console.log(b); // 报错 console.log(c); // 报错 } 接下来是变量提升。var声明的变量会被提升到函数顶部,初始值为undefined,而letconst虽然也被提升,但不会初始化,导致暂时性死区。例如: console.log(x); // undefined var x = 5; console.log(y); // 报错 let y = 10; 重复声明方面,var允许重复声明,但letconst不允许。比如: var d = 1; var d = 2; // 没问题 let e = 3; let e = 4; // 报错 对于赋值,const声明必须初始化,且不能重新赋值,但如果声明的是对象,其属性可以修改。例如: const obj = { a: 1 }; obj.a = 2; // 允许 obj = {}; // 报错 使用场景方面,建议用const作为默认选择,特别是对于常量或不需要重新赋值的变量。let用于需要重新赋值的块作用域变量,而var现在一般不再推荐使用,除非需要函数作用域的特殊情况。 需要确保引用的内容正确,用户提供的引用[1][2]提到需要探讨历史背景差异,所以应该包含这些要点。另外,引用[4]中的代码示例可能帮助说明块级作用域的应用,但可能不需要直接引用。 最后,生成相关问题时要围绕这三个关键字的其他方面,比如临时死区、最佳实践、块作用域的影响等。</think>### JavaScript中`let`、`var`与`const`的区别及使用场景 #### 1. **作用域** - **`var`**:函数作用域。在函数内部声明的变量,整个函数内均可访问。 例如: ```javascript function testVar() { if (true) { var a = 10; } console.log(a); // 输出10(在if块外仍可访问) } ``` - **`let``const`**:块级作用域。仅在声明的代码块(如`{}`)内有效。 例如: ```javascript function testLet() { if (true) { let b = 20; const c = 30; } console.log(b); // 报错:b未定义 console.log(c); // 报错:c未定义 } ``` #### 2. **变量提升(Hoisting)** - **`var`**:变量会被提升到函数顶部,初始值为`undefined`。 ```javascript console.log(x); // 输出undefined var x = 5; ``` - **`let``const`**:虽然也会被提升,但不会被初始化,访问时会触发“暂时性死区”(Temporal Dead Zone)。 ```javascript console.log(y); // 报错:Cannot access 'y' before initialization let y = 10; ``` #### 3. **重复声明** - **`var`**:允许重复声明,可能导致变量意外覆盖。 ```javascript var z = 1; var z = 2; // 合法 ``` - **`let``const`**:禁止重复声明。 ```javascript let w = 3; let w = 4; // 报错:Identifier 'w' has already been declared ``` #### 4. **赋值限制** - **`const`**:声明时必须初始化,且不能重新赋值(但对象或数组的内容可修改)。 ```javascript const PI = 3.14; PI = 3.1415; // 报错:Assignment to constant variable const arr = [1, 2]; arr.push(3); // 合法:修改内容允许 ``` #### 5. **使用场景** - **`const`**:默认选择,用于常量或不需要重新赋值的变量(如配置项、对象引用)[^1][^2]。 - **`let`**:需要块级作用域且可能重新赋值的变量(如循环计数器)。 - **`var`**:现代开发中已不推荐,仅在某些需要函数作用域的场景使用。 --- ### 示例对比 ```javascript // 作用域差异 function scopeExample() { var a = 1; if (true) { var a = 2; // 覆盖外层a let b = 3; } console.log(a); // 输出2 console.log(b); // 报错 } // const的不可变性 const user = { name: "Alice" }; user.name = "Bob"; // 合法(修改属性) user = {}; // 报错(重新赋值引用) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

97pra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值