var、let、const区别及作用域、作用域链

1.var

声明全局变量,与window的属性等价

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

var声明的变量有变量提升(可以先用再声明)

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

可以重复声明,后面声明的覆盖前面的

var a=1;
function f(){
var a=2;
}
f()
console.log(a)//2

若一个变量不声明就当作全局变量

var a=1;
function f(){
a=2;
}
f()
console.log(a)//2

2.let

let是ES6新增的,但与var不同的是let声明的变量作用于块级

{
let a=2;}
console.log(a)//ReferenceError: a is not defined

不存在变量提升

console.log(a);//报错ReferenceErro
let a=1;

不能在同一作用域内重复声明

let a = 20
let a = 30
// Uncaught SyntaxError: Identifier 'a' has already been declared

不同作用域可以

let a = 20
function f(){
let a = 30
}
let a = 30

只要块级作用域内存在let命令,这个区域就不再受外部影响

var a=1;
function f(){
a=2// ReferenceError
let a}

3.const

声明一个只读的常量,一旦声明,不能改变

const a=1
a=3//TypeError: Assignment to constant variable.

一旦声明就立即赋值,不要之后再赋值

const a;//SyntaxError: Missing initializer in const declaration

若之前var/let声明过的变量不能再用const 声明
const 保证变量指向的内存地址所保存的数据不变
对简单类型的数据,值保存在变量指向的那个内存地址,因此相当于常量,对复杂类型的数据,变量指向的内存地址保存的是指向实际数据的指针,const只能保证指针是固定的,并不能确保变量的结构不变

const foo={}
foo{}//报错

其他和let一样,不能变量提升,不能重复声明

区别

  1. var 允许变量提升,let和const不能
  2. var允许重复声明,let和 const不允许
  3. var作用于全局,let和const作用于块级作用域
  4. var和let 可以修改已经声明的变量,const不能

注:能用const尽量用const,其他情大多用let,避免使用var

4.作用域

作用域即定义变量的区域
作用域分为

  • 全局作用域:最外层定义的作用域、函数内未定义的变量、window.XX属性拥有
  • 函数作用域:只能在函数内访问,
  • 块级作用域(ES6新增):{ }内,如if、swich、for、while等
    js采用的是静态作用域(词法作用域,即定义函数时确定了作用域,相对的动态作用域就是调用函数时才确定作用域,在块级作用域中不能用let或const重复声明,嵌套的花括号里可以

作用域链

找变量从内层往外层找,直达找到为止
准确来说是在创建函数的所在作用域找,而不是调用函数的作用域

var a=10
function f(){
	var b=20
	function bar(){
		console.log(a+b)
	}
	return bar
}
var x=f()
b=200
x()//30
//将bar()函数赋给x,执行console.log(a+b)时b向创建bar函数的作用域中(f函数作用域)找,找到b=20,找a时在f函数作用域没找到,转向创建f函数的作用域中找,a=10

参考文章:https://juejin.cn/post/6844903797135769614
https://vue3js.cn/interview/es6/var_let_const.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值