19.ES6-let和cost

2022-02-07  本文已影响0人  静昕妈妈芦培培

在ES5中我们声明变量都是使用的var关键字,从ES6开始新增了两个关键字可以声明变量:letconst

let关键字:

const关键字:

注意:另外let、const不允许重复声明变量;

es6新增了使用let/const声明变量

1.let 声明的变量可以被重新赋值,
let name = "why";
name = "koby";
console.log(name); // koby
2.const 声明的变量不可以重新被赋值,但是如果其值是引用类型的话,可以改变引用类型值的属性的值
const age = 18;
// age = 20  //TypeError: Assignment to constant variable.
const info = { name: "why", age: 18 };
info.name = "koby";
console.log(info); //{name: 'koby',age: 18}
3.const声明的变量,在声明时必须被赋值
 const height; //SyntaxError: Missing initializer in const declaration
4.let/const声明的变量是不可以重复被声明的
let name = "why";
const info = { name: "why", age: 18 };

let name = 'lily' // SyntaxError: Identifier 'name' has already been declared
const info = '你好' // SyntaxError: Identifier 'info' has already been declared

var和let的作用域提升

1.var声明的变量存在作用域提升,即在声明之前可以访问

console.log(foo) //undefined

var foo = 'abc'

2.let声明的变量不存在作用域提升

console.log(foo); //ReferenceError: Cannot access 'foo' before initialization

let foo = "abc";

let、const和var的另一个重要区别是作用域提升:

那么是不是意味着foo变量只有在代码执行阶段才会创建的呢?

let/const有没有作用域提升呢?

从上面我们可以看出,在执行上下文的词法环境创建出来的时候,变量事实上已经被创建了,只是这个变量是不能被访问的

事实上维基百科并没有对作用域提升有严格的概念解释,那么我们自己从字面量上理解;

所以我的观点是let、const没有进行作用域提升,但是会在解析阶段被创建出来。

let和const和window之间的关系

我们知道,在全局通过var来声明一个变量,事实上会在window上添加一个属性:

let flag = 0;
var name = "why";
const info = {
  name: "koby",
  age: 40,
};

console.log(flag); // 0
console.log(window.flag); //undefined
console.log(window.name); // why

非常感谢王红元老师的深入JavaScript高级语法让我学习到很多 JavaScript 的知识

上一篇 下一篇

猜你喜欢

热点阅读