var,let和const

1.提升(hoisting)

1
2
console.log(a) // undefined
var a = 1

可以先看上面的例子,a变量虽然还没有被声明,但我们可以使用这个未被声明的变量,这种情况就叫提升,并且提升的是声明,为什么输出的是undefined?因为赋值并未跟着提升,这段代码可以这么看:

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

所以可以看下面

1
2
3
4
5
6
7
8
9
10
var a = 2
var a
console.log(a)
 
理解为
 
var a
var a
a= 2
console.log(a) // 2

 到此为止,我们已经知道了'var'声明的变量会发生提升的情况.除了变量可以提升外,函数也会提升,先看个例子

1
2
3
console.log(a) // ƒ a() {}
function a() {}
var a = 1 

对于上面的代码,输出结果是'ƒ a() {}',即使变量在函数之后,说明了函数会提升,并且优先于变量提升.接下来继续代码:

1
2
3
4
5
6
7
8
9
10
11
var a = 1
let b = 1
const c = 1
console.log(window.b) // undefined
console.log(window. c) // undefined
 
function test(){
  console.log(a)
  let a
}
test()

首先const和let在全局作用域下声明的变量并不会挂载到window上(es5),而var声明的变量是会挂载到window上的(es6),再者在用let和const声明变量之前用了变量会报错(形成了暂时性死区).let和const声明的变量存放在script的块级作用域当中.

总结如下:

1. 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部

2. `var` 存在提升,我们能在声明之前使用。`let`、`const` 因为暂时性死区的原因,不能在声明前使用

3. `var` 在全局作用域下声明变量会导致变量挂载在 `window` 上,`let`和`const` 声明后,可在script形成的作用域中找到

4. var 和 let 声明的时候可以不初始化赋值,const声明时必须赋值,且不可修改,如果const存储的是基本数据类型(string,number,boolean,null,undefined),值不可修改,如果保存的为引用类型(Function,Array,Object),变量指向的是保存值的地址,地址不变,值不可控制

5. 同一作用域下let和const不允许重复声明,否则会报错,而var可以

posted @   月下云生  阅读(66)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示