当前位置: 首页 > news >正文

JS中声明变量,使用 var、let、const的区别

一、var 的使用

1.1、var 的作用域

1、var可以在全局范围声明或函数/局部范围内声明。当在最外层函数的外部声明var变量时,作用域是全局的。这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。

2、当在函数中声明var时,作用域是局部的。这意味着它只能在函数内访问。

示例:

var greeter = 'hey hi';function newFunction() {var hello = 'hello';
}

这里,greeter是全局范围的,因为它存在于函数外部,而hello是函数范围的。因此,我们无法在函数外部访问变量hello。

1.2 var 变量可以重新声明和修改

这意味着我们可以在相同的作用域内执行下面的操作,并且不会出错

var greeter = 'hey hi';
var greeter = 'say Hello instead';

又比如

var greeter = 'hey hi';
greeter = 'say Hello instead';

1.3 var 的变量提升

变量提升是 JavaScript 的一种机制:在执行代码之前,变量和函数声明会移至其作用域的顶部。这意味着如果我们这样做:

console.log(greeter);
var greeter = 'say hello';

生面的代码会被解释为:

var greeter;
console.log(greeter); // greeter is undefined
greeter = 'say hello';

因此,将var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。

二、let 的使用

2.1、let 是块级作用域

块是由 {} 界定的代码块,大括号中有一个块。大括号内的任何内容都包含在一个块级作用域中.因此,在带有let的块中声明的变量仅可在该块中使用。让我用一个例子解释一下:

let greeting = 'say Hi';
let times = 4;if (times > 3) {let hello = 'say Hello instead';console.log(hello); // "say Hello instead"
}
console.log(hello); // hello is not defined

我们看到在其代码块(定义它的花括号)之外使用hello会返回错误。这是因为let变量是块范围的.

2.2、let 可以被修改但是不能被重新声明

就像var一样,用 let声明的变量可以在其范围内被修改。但与var不同的是,let变量无法在其作用域内被重新声明。 来看下面的例子:

let greeting = 'say Hi';
let greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

但是,如果在不同的作用域中定义了相同的变量,则不会有错误:

let greeting = 'say Hi';
if (true) {let greeting = 'say Hello instead';console.log(greeting); // "say Hello instead"
}
console.log(greeting); // "say Hi"

这个事实说明:使用let,是比var更好的选择。当使用let时,你不必费心思考变量的名称,因为变量仅在其块级作用域内存在。

同样,由于在一个块级作用域内不能多次声明一个变量,因此不会发生前面讨论的var出现的问题。

2.3、let 的变量提升

就像var一样,let声明也被提升到作用域顶部。

但不同的是:

1、用var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。

2、用let声明的变量会被提升到其作用域的顶部,不会对值进行初始化。

因此,如果你尝试在声明前使用let变量,则会收到Reference Error。

三、const 的使用

3.1、const 声明的变量在块级作用域内

像let声明一样,const声明只能在声明它们的块级作用域中访问。

3.2、const 不能被修改并且不能被重新声明

这意味着用const声明的变量的值保持不变。不能修改或重新声明。因此,如果我们使用const声明变量,那么我们将无法做到这一点:

const greeting = 'say Hi';
greeting = 'say Hello instead'; // error: Assignment to constant variable.

或者这个这样:

const greeting = 'say Hi';
const greeting = 'say Hello instead'; // error: Identifier 'greeting' has already been declared

因此,每个const声明都必须在声明时进行初始化。

当用const声明对象时,这种行为却有所不同。虽然不能更新const对象,但是可以更新该对象的属性。 因此,如果我们声明一个const对象为

const greeting = {message: 'say Hi',times: 4,
};

同样不能像下面这样做:

const greeting = {words: 'Hello',number: 'five',
}; // error:  Assignment to constant variable.

但我们可以这样做:

greeting.message = 'say Hello instead';

这将更新greeting.message的值,而不会返回错误。

3.3、const 的变量提升

就像let一样,const声明也被提升到顶部,但是没有初始化。

四、var、let、const 区别总结

1、var声明是全局作用域或函数作用域,而let和const是块作用域。

2、var变量可以在其范围内更新和重新声明; let变量可以被更新但不能重新声明; const变量既不能更新也不能重新声明。

3、它们都被提升到其作用域的顶端。但是,虽然使用变量undefined初始化了var变量,但未初始化let和const变量。

4、尽管可以在不初始化的情况下声明var和let,但是在声明期间必须初始化const。

http://www.lryc.cn/news/10557.html

相关文章:

  • 汽车改装避坑指南:大尾翼
  • 【Unity资源下载】POLYGON Dungeon Realms - Low Poly 3D Art by Synty
  • 知识汇总:Python办公自动化应该学习哪些内容
  • 软件架构知识5-架构设计流程
  • 【银河麒麟V10操作系统】修改屏幕分辨率的方法
  • pdf生成为二维码
  • Yaklang websocket劫持教程
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现
  • 【每日一题】 将一句话单词倒置,标点不倒置
  • 宽刈幅干涉雷达高度计SWOT(Surface Water and Ocean Topography)卫星进展(待完善)
  • openjdk源码==类加载过程
  • vue2的后台管理系统 迁移到 vue3后台管理系统
  • 2023年美赛F题
  • 【数据结构与算法分析】介绍蛮力法以及相关程序案例
  • 用股票交易量查询接口是怎么查询a股全天总成交量的?
  • 求职季哪种 Python 程序员能拿高薪?
  • 如何选择好的IB课程学校?
  • 2023美赛ABCDEF题思路+参考文献+代码
  • DataEase 制作数据可视化大屏经验分享
  • 前端基础-2day
  • 在线一键JS混淆还原
  • Java基本语法
  • 什么表单设计工具能快速提升办公效率?
  • SystemVerilog——Axi4Lite_To_Localbus
  • 硬件_IMX6ULL的LCD控制器
  • ICLR 2022—你不应该错过的 10 篇论文(下)
  • 国内外优秀程序员的私域博客大全
  • 【C++ Primer Plus】第六章:分支语句和逻辑运算符
  • 堡垒机的主要功能是什么?为什么需要堡垒机?
  • 记录spring中Transactional事务注解失效的六个场景