let和const声明

xiaoxiao2021-02-28  57

let和const声明

let命令

let声明只能在代码块中起效

{ let a = 10; var b = 1; } a // 未定义 b // 1 var全局声明

let变量在循环中 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 每次循环都是一个新的 let变量

let在循环条件里的变量和循环体内的变量不在同一个作用域

for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } // abc // abc // abc

let变量不会提前申明变量

// var 的情况 console.log(foo); // 输出undefined var foo = 2; // let 的情况 console.log(bar); // 报错ReferenceError let bar = 2;

暂时性死区(let一旦在一个代码块中声明,就绑定了这个区域 变量不能引用之前的变量)

var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } // 不报错 var x = x; // 报错 let x = x; //x还没声明完成 暂时死区 // ReferenceError: x is not defined

不能重复声明

function func(arg) { let arg; // 报错 arg在变量栏里已经声明了一次 } function func(arg) { { let arg; // 不报错 在代码快中可以申明一次 } }

块级作用域

作用:var变量泄露到方法的全局 let只在代码块中起作用

let取代块立即执行表达式的闭包方法

(function () { var tmp = ...; ... }()); // 块级作用域写法 { let tmp = ...; ... }

es6代码块中可以声明函数 但是最好写成函数表达式(最好不要再代码块中声明函数)

const命令

const声明声明一个只读常量,其他与let无区别

const对于简单类型数据可以保证是一个固定的常量,对于一个对象数组的复杂类型数据,只能保证地址不变,如果想声明一个不变的对象,可以冻结对象

const foo = Object.freeze({}); // 常规模式时,下面一行不起作用; // 严格模式时,该行会报错 foo.prop = 123;

顶层对象与全局变量分离

浏览器顶层对象是 window node的顶层对象是global

es6中 var function声明仍旧属于顶层对象 的属性

window.a = 1; a // 1 a = 2; window.a // 2

let const class 声明的全局变量 不是顶层对象的属性

var a = 1; // 如果在 Node 的 REPL 环境,可以写成 global.a // 或者采用通用方法,写成 this.a window.a // 1 let b = 1; window.b // undefined

global对象

顶层对象在浏览器中实现不统一,通常用this变量取到顶层对象

下面这种方法可以勉强通用取到顶层对象

// 方法一 (typeof window !== 'undefined' ? window : (typeof process === 'object' && typeof require === 'function' && typeof global === 'object') ? global : this); // 方法二 var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } throw new Error('unable to locate global object'); };
转载请注明原文地址: https://www.6miu.com/read-2625267.html

最新回复(0)