美文网首页JavaScript
ES6学习第一节:let const

ES6学习第一节:let const

作者: ChangLau | 来源:发表于2018-12-27 11:49 被阅读0次

参考链接

let

  • 作用域
{
     let a = 1;
     var b = 2;
}
console.log(a); //Uncaught ReferenceError: a is not defined

let 声明的变量只在所生命的代码块内生效

var a = [];
for(var i=0; i<10; i++){
  a[i] = function(){
    console.log(i)
  }
}
a[6]() = 10

var a = [];
for(let i=0; i<10; i++){
  a[i] = function(){
    console.log(i)
  }
}
a[6]() = 6
  • 不存在变量提升
console.log(a); // undefined var存在变量提升
var a = 1;

console.log(b); // b is not defined
let b = 2;
  • 暂时性死区
var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
//如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
  • 不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

// 报错
function func() {
  let a = 10;
  var a = 1;
}

// 报错
function func() {
  let a = 10;
  let a = 1;
}

function func(arg) {
  let arg; // 报错
}

function func(arg) {
  {
    let arg; // 不报错
  }
}

为什么需要块级作用域

// 内层变量可能会覆盖外层变量
var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined

// 用来计数的循环变量泄露为全局变量
var s = 'hello';

for (var i = 0; i < s.length; i++) {
  console.log(s[i]);
}

console.log(i); // 5

const

const声明一个只读的常量。一旦声明,常量的值就不能改变。
const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const PI = 3.1415926

  • 作用域
// const的作用域与let命令相同:只在声明所在的块级作用域内有效。
if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined
  • 暂时性死区
if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}
  • 不可重复声明
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
  • 不存在变量提升
console.log(PI)
const PI = 3.1415926 //PI is not defined

const本质

const a = 1;
a = 2; // error

const obj = {};
obj.a = 1; //true
// const只能冻结对象指向地址,如果需要冻结对象,可以使用如下冻结函数。
var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

顶层对象属性

var命令和function命令声明的全局变量,依旧是顶层对象的属性
var a = 1;
window.a = 1;

function b(){}
window.b = function

let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
let a = 1;
window.a // undefined

函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。
function test(){
    console.log(this)
}
test() // window.test()
VM341:2 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}

var t = new test()
VM341:2 test {} //this指向 t

相关文章

  • (JS)

    ES6 let、const和var的区别 let和const声明变量不存在变量提升 let和const不能重复声明...

  • es6,es7,es8语法总结

    ES6 1. var let const let,const具有块级作用域,不具有变量提升 const 用...

  • ES 6 7 8 随笔 QAQ

    ES6 1. var let const let,const具有块级作用域,不具有变量提升 const 用...

  • ES6(let 与 const)

    ES6中引入了let 和 const来声明变量,我们来看下let 和 const 的使用 一、let let定义的...

  • 05.Es6入门学习笔记(阮一峰教程)

    Es6学习笔记 一、let和const 1. let,const不存在变量提升,只在声明所在的块级作用域中有效。 ...

  • react 入门基础(一)之ES6

    ####ES6 let const var 三者的区别 ### 1. let const 不能重复声明变...

  • es6总结一

    es6基础 let和const命令 let和const用于声明变量let跟var的区别 1、let定义过的变量不能...

  • ES6特性学习(一)

    本篇对ES6的let、const进行了学习和整理,以及与var做一下简单的对比。 let命令 let是ES6中新增...

  • ES6之 let 和 const 命令

    ES6 之 let 和 const 命令 1、let 命令 1.1、基本用法 ES6 新增了let命令,用来声明变...

  • es6解读1: let, const 和 smybol

    let const 作用域 作用域概念 如何使用let和const 使用let 形成块级作用域 es6下强制开启...

网友评论

    本文标题:ES6学习第一节:let const

    本文链接:https://www.haomeiwen.com/subject/rztrlqtx.html