当前位置:网站首页>var、let、const 三者的区别
var、let、const 三者的区别
2022-06-29 00:01:00 【涛涛之海】
var、let、const 三者的区别
文章目录
var
在 ES6 出现之前,必须使用 var 声明。但是使用var 会带来一些问题,才在ES6中出现了let 和 const。先来了解一下var 的特点。
var 的作用域
var可以在全局范围声明或函数/局部范围内声明。
当在最外层函数的外部声明var变量时,作用域是全局的。这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。
当在函数中声明var时,作用域是局部的。这意味着它只能在函数内访问。
var 变量可以重新声明和修改
这意味着我们可以在相同的作用域内执行下面的操作,并且不会出错。
var greeter = 'hey hi';
var greeter = 'say Hello instead';
var greeter = 'hey hi';
greeter = 'say Hello instead';
var 的变量提升
变量提升是 JavaScript 的一种机制:在执行代码之前,变量和函数声明会移至其作用域的顶部。这意味着如果我们这样做:
function person(status) {
if (status) {
var value = "蛙人"
} else {
console.log(value) // undefined
}
console.log(value) // undefined
}
person(false)
相当于下面:
function person(status) {
var value;
if (status) {
var value = "蛙人"
} else {
console.log(value) // undefined
}
console.log(value) // undefined
}
person(false)
var的问题
基于上面三点,可能会导致var 出现的问题是
var greeter = "hey hi";
var times = 4;
if (times > 3) {
var greeter = "say Hello instead";
}
console.log(greeter) // "say Hello instead"
由于times> 3返回 true,因此将greeter重新定义为saysay Hello。如果你是故意重新定义greeter,这段代码是没有问题的,但是当你不知道之前已经定义了变量greeter时,这将成为产生问题。其他地方再用 greeter 时,可能会出现错误。
let
let现在已经成为变量声明的首选。因为他解决了 上述的var 的问题。
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
let 可以被修改但是不能被重新声明.
就像var一样,用let声明的变量可以在其范围内被修改。但与var不同的是,let变量无法在其作用域内被重新声明。
let greeting = 'say Hi';
greeting = 'say Hello instead';
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出现的问题。
let 的变量提升
就像var一样,let声明也被提升到作用域顶部。
但不同的是:
- 用
var声明的变量会被提升到其作用域的顶部,并使用 undefined 值对其进行初始化。 - 用
let声明的变量会被提升到其作用域的顶部,不会对值进行初始化。
因此,如果你尝试在声明前使用let变量,则会收到Reference Error。
const
用const声明的变量保持常量值。
const 的块级作用域内
像let声明一样,const声明只能在声明它们的块级作用域中访问
const 不能被修改并且不能被重新声明
这意味着用const声明的变量的值保持不变。不能修改或重新声明。因此,如果我们使用const声明变量,那么我们将无法做到这一点:
const greeting = 'say Hi';
greeting = 'say Hello instead'; // error: Assignment to constant variable.
因此,每个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';
const 的变量提升
就像let一样,const声明也被提升到顶部,但是没有初始化。
总结
var声明是全局作用域或函数作用域,而let和const是块作用域。var变量可以在其范围内更新和重新声明;let变量可以被更新但不能重新声明;const变量既不能更新也不能重新声明。- 它们都被提升到其作用域的顶端。但是,虽然使用变量
undefined初始化了var变量,但未初始化let和const变量。 - 尽管可以在不初始化的情况下声明
var和let,但是在声明期间必须初始化const。
参考文章
边栏推荐
- Trois questions PWN
- Stm32f407 ------ serial (serial port) communication
- 转载:VTK笔记-裁剪分割-不规则闭合圈选裁剪-vtkSelectPolyData类(黑山老妖)
- Huawei's level 22 experts have worked hard for ten years to complete the advanced practical document of cloud native service grid. 6
- MNIST handwritten numeral recognition demo based on pytorch framework
- 每日一题:消失的数字
- Typescript-- section 4: Functions
- Stm32f407------- external interrupt
- Xiaobai's e-commerce business is very important to choose the right mall system!
- What are the virtual machine software? What are their respective roles?
猜你喜欢

Typescript -- Section 1: basic types

stm32F407-------时钟系统(SystemInit时钟初始化、Systick滴答定时器)

mysql 8.0以上报2058 解决方式

这玩意叫跳表?

Stm32f407 ------- IO pin multiplexing mapping
![[opencv] - linear filtering: box filtering, mean filtering, Gaussian filtering](/img/1d/3a46517cbfa90005a15d7858d81ca9.png)
[opencv] - linear filtering: box filtering, mean filtering, Gaussian filtering

10、YOLO系列

随笔记:插入排序 --from wcc

Along with the notes: methods simulating array like classes

每日一题:移除元素
随机推荐
Typescript -- Section 6 generic
Typescript-- section 4: Functions
Be on the list again! Know that Chuangyu was selected as one of the top 50 competitive enterprises in China's network security industry in 2022
Typescript -- Section 2: variable declaration
12. object detection mask RCNN
点击劫持:X-Frame-Options未配置
WPF implementation calls local camera~
Picture 64base transcoding and decoding
Stm32f407 ------ serial (serial port) communication
stm32F407-------IO引脚复用映射
Baidu knows the crawler, and obtains the dialogue below the comment according to the question Id, clue ID and comment ID
Yyds dry goods count 【 vs code work record III 】 set vs code format
[machine learning] numerical analysis 02 -- finding roots of arbitrary equations
单机多实例MYSQL主从复制
How to solve the database type error in the operation of the servert project?
在线买股票开户安全嘛?
【LeetCode】21. 合并两个有序链表 - Go 语言题解
转载:VTK笔记-裁剪分割-三维曲线或几何切割体数据(黑山老妖)
With notes: insert sort --from WCC
Don't ask me how to do UI automation test again