let var const

let var const

var有变量提升,函数作用域、,可以重复预定义

let没有变量提升,块级作用域,可以重复定义,有暂时性死区(只有等到声明变量的那一行代码出现,才可以获取和使用该变量)

const定义的变量不可重新定义,不可以重新赋值,没有变量提升,块级作用域,暂时性死区

尽量使用 const 声明不可变的变量,使用 let 声明可变的变量,以及避免使用 var

原因主要是为了代码的可读性和可维护性,以及减少意外的变量重新赋值,从而提高代码质量。而避免使用 var 则是因为它存在一些不利于代码健壮性和可维护性的特性。下面是这些原因的详细解释:

使用 const 声明的变量在声明后不能被重新赋值,这传达了一个明确的意图:这个变量在整个作用域内是不可变的,即常量。这有助于代码的可读性,让开发人员更容易理解代码的意图。
当你看到一个 const 声明时,你知道这个变量的值在后续的代码中不会被修改,从而减少了不必要的担忧和错误。

避免意外的重新赋值:

使用 let 声明的变量可以被重新赋值,这增加了代码中可能发生意外赋值的风险。如果一个变量不需要重新赋值,最好使用 const 来防止意外的变量重新赋值,从而减少 bug 的出现。
在大型项目中,减少意外的变量重新赋值可以减轻调试和维护的负担,提高代码的健壮性和可维护性。
代码健壮性和可维护性:

使用 const 和 let 有助于提高代码的健壮性和可维护性。它们提供了更好的作用域管理,避免了变量提升和全局变量的问题,使代码更加可靠和易于理解。
var 存在变量提升的问题,而且它的作用域是函数作用域,容易造成变量泄漏和命名冲突,因此在大多数情况下应避免使用它

什么时候用var

1.向后兼容性:

如果你需要支持较旧版本的 JavaScript 引擎,可能需要使用 var。虽然现代浏览器和 Node.js 等环境已经支持 let 和 const,但如果你的代码需要在较旧的环境中运行,可能需要使用 var。
2.变量提升:

在使用 var 声明的变量会发生变量提升(hoisting)的情况,这意味着变量可以在声明之前被访问,但其值为 undefined。在一些特定的场景下,这种行为可能是你想要的,但在大多数情况下,变量提升可能导致代码难以理解和维护。
3.全局作用域:

在全局作用域中声明变量时,使用 var 可以将变量绑定到全局对象上(在浏览器中是 window 对象),而 let 和 const 声明的全局变量不会绑定到全局对象上。如果你需要在全局作用域中声明一个变量,并且希望它作为全局对象的属性存在,那么可以使用 var。
4.闭包中的变量:

在某些情况下,你可能希望在闭包内部访问函数外部的变量,并且希望该变量具有函数级作用域。在这种情况下,使用 var 可以将变量声明为函数级作用域,从而实现闭包中的变量访问。

虽然现代 JavaScript 中推荐使用 let 和 const,但在某些特定的场景下,使用 var 也可能更合适。一个典型的情况是在闭包中使用 var。
考虑以下示例场景:在循环中创建多个事件监听器,并且每个监听器都需要访问循环变量的当前值。在这种情况下,使用 var 可能更加合适,因为它可以在循环中创建函数作用域,从而实现对循环变量的正确访问。
 

// 使用 let 的闭包示例
var buttons = document.getElementsByTagName('button');

for (let i = 0; i < buttons.length; i++) {
    buttons[i].addEventListener('click', function() {
        console.log('Button ' + i + ' clicked');
    });
}

在上面的例子中,我们在循环中使用 var i 创建了闭包。由于 JavaScript 中的闭包会捕获函数创建时的作用域,而不是调用时的作用域,因此每个事件监听器都能够正确地访问到循环变量 i 的当前值。
如果我们使用 let 替换 var,则每个事件监听器都会捕获 i 的当前值,因为 let 创建了一个新的块级作用域。

在这种情况下,使用 var 可以更容易地实现预期的行为,因此在闭包中需要访问循环变量的场景下,使用 var 可能更合适。

undefined和null区别。

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