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