var,let和const

1.提升(hoisting)

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

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

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

所以可以看下面

var a = 2
var a
console.log(a)

理解为

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

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

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

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

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 @ 2021-09-17 17:29  月下云生  阅读(76)  评论(0)    收藏  举报