var、function、let、const变量提升

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了var、function、let、const变量提升相关的知识,希望对你有一定的参考价值。

参考技术A

我是从这两篇文章的阅读中,做出了自己的总结,如果不明白的话可以看看这两篇文章:

变量提升情况:

变量提升概念:

js引擎在执行过程中变量的生命周期分为三个阶段: 注册、初始化、赋值

var、funciton、let、const的生命周期:

var 在注册阶段初始化是一起的,会被赋值为 undefined ,所以变量提升,打印出的是 undefined

function 在注册阶段初始化、执行都一起了,所以函数不管写在哪里都可以直接调用

let 在注册阶段和初始化是解耦的,只是创建了但是并未初始化,所以出现了暂时性死区,打印出的是 \'x is not defined\'

const 的生命周期与let一样,只不过没有赋值阶段

var / let / const

1、var在声明所在的函数作用域内有效。  function(){}

   let与const都是只在声明所在的块级作用域内有效。{}

2、var与let声明的变量可以改变,值和类型都可以改变,没有限制。

     const声明的常量不得改变值,这意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值,且不能重复赋值。

const a;    // 报错,一旦声明变量,应该立即赋值!!

const b = 10;
b = 20;    // 报错,因为定义常量之后不能重新赋值!!

3、对于复合类型的变量,如数组和对象,变量名不指向数据,而是指向数据所在的地址。

  const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变。

const arr = [];
arr = [1, 2, 3];   // 报错,因为变量arr指向的地址不能发生改变,应始终指向[]所在的地址!!![1,2,3]与[]不是同一个地址

  下面这样就不会报错:

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

  对象也是如此,示例如下:

const obj = {
	a: 1,
	b: 2
};
obj = { // 报错 a: 3, b: 4 };
obj.a = 3; // 不报错 obj.b = 4; // 不报错

  

如果想让定义的对象或数组的内部数据也不能够修改和改变,可以使用Object.freeze(obj)进行冻结,这样为对象添加新属性就不起作用。

除了将对象本身冻结,对象的属性也应该冻结。

const obj = {
	a: 1,
	b: 2
};
obj.a = 9;
console.log(obj);   // {a: 9, b: 2};  obj.a 发生改变
Object.freeze(obj);  // 冻结
obj.b = 99;
console.log(obj);   // {a: 9, b: 2};  obj.b 未发生改变

  参考:let和const命令

以上是关于var、function、let、const变量提升的主要内容,如果未能解决你的问题,请参考以下文章

es6 - 一共有 6 种声明变量的方法(var, function, let, const, class, import)

复习es6-let和const

var / let / const

let const var 区别

let和const变量学习

varlet和const的区别