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可以
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)