JavaScript

ES6学习第一节:let const

2018-12-27  本文已影响0人  ChangLau

参考链接

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
上一篇 下一篇

猜你喜欢

热点阅读