let,const,var 的区别

在 JavaScript 中,letconst 和 var 都用于声明变量,但它们在作用域、变量提升和重复声明等方面有显著区别。

一、作用域方面

1.var

  • 函数作用域:在函数内部声明的变量只能在函数内访问;在全局作用域声明的变量则是全局的。
  • 如果在块(如 iffor)中声明,变量会泄漏到外部(因为块不构成独立作用域)。
function example() {
  if (true) {
    var x = 10;
  }
  console.log(x); // 10(可以访问)
}

2.let 和 const 

  • 块级作用域:仅在声明它的 {} 内有效(如 iffor、函数等)。
if (true) {
  let y = 20;
  const z = 30;
}
console.log(y); // ReferenceError: y is not defined
console.log(z); // ReferenceError: z is not defined

二、变量提升方面

1.var

  • 变量会被提升到作用域顶部,但​​初始化不提升​​(值为 undefined)。
  • 变量声明会被提升​​,但​​赋值不会提升​​。
  • 提升后,变量的初始值是 undefined
  • 变量提升:指的是在代码执行前,JavaScript 引擎会将​​变量声明​​和​​函数声明​​提升到它们所在作用域的顶部。但需要注意的是,只有声明会被提升,赋值操作不会被提升
console.log(a); // undefined(不会报错)
var a = 5;

// 相当于
var a; // 声明被提升到顶部
console.log(a); // undefined
a = 5; // 赋值留在原地

2. let 和 const 

也会被提升,但存在​​暂时性死区:在声明前访问会抛出 ReferenceError。

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;

// 相当于

let b;
console.log(b);
b = 10;

3.补充:(函数变量提升)

 整个函数声明(包括函数体)都会被提升​​,所以可以在声明前调用函数。

foo(); // 输出:"Hello"

function foo() {
  console.log("Hello");
}

// 相当于

function foo() { // 整个函数声明被提升
  console.log("Hello");
}
foo();

// 函数表达式不会被提升
// 如果是 var 声明的函数表达式,​​只有变量声明会被提升​​,函数赋值不会提升。
bar(); // 报错:bar is not a function(因为 var bar 被提升,但此时 bar 是 undefined)

var bar = function() {
  console.log("World");
};

// 相当于
var bar; // 声明被提升
bar(); // 此时 bar 是 undefined,调用会报错
bar = function() { console.log("World"); };

三、赋值方面

1.重复声明

 ①var

  • 允许重复声明,后声明的值会覆盖前者。
var c = 1;
var c = 2; // 合法

②let 和 const

  • 禁止重复声明,会抛出 SyntaxError
let d = 1;
let d = 2; // SyntaxError: Identifier 'd' has already been declared

2.值是否可变

①var 和 let

  • 声明的变量可以重新赋值。
let e = 1;
e = 2; // 合法

②const

  • 声明的是常量,必须初始化且不能重新赋值(但对于对象/数组,属性或元素可修改)。
const f = 1;
f = 2; // TypeError: Assignment to constant variable

const obj = { name: "Alice" };
obj.name = "Bob"; // 合法(修改属性)

总结

  1. 优先使用 const​:除非需要重新赋值,否则用 const 声明变量(保证不可变性)。
  2. ​需要重新赋值时用 let​:如循环计数器、条件分支中的变量。
  3. ​避免使用 var​:现代 JavaScript 中 var 已逐渐被淘汰(ES6+ 推荐 let/const)。

你可能感兴趣的:(ES6,前端,javascript,开发语言)