function order(x, y) { if (x > y) { // (A) let tmp = x; x = y; y = tmp; } console.log(tmp===x); // ReferenceError: tmp is not defined return [x, y]; }
const foo; // SyntaxError: Missing initializer in const declaration const bar = 123; bar = 456; // TypeError: `bar` is read-only
const obj = {a: 123}; obj.a = 234; console.log(obj.a); // 234 const obj2 = Object.freeze({a:123}); obj.a = 234; // 这里应该要报错的,但是chrome现在没有报错 console.log(obj.a); // 123
由let和const声明的变量都会有自己的TDZ。当进入这个变量的作用域的时候,这个变量是不能被访问的,直到这个变量被初始化。我们来看下面一段代码
let tmp = true; if (true) { // enter new scope, TDZ starts // Uninitialized binding for `tmp` is created console.log(tmp); // ReferenceError let tmp; // TDZ ends, `tmp` is initialized with `undefined` console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 } console.log(tmp); // true
TDZ的原因可以简单地理解为,let和const不存在变量提升
并且要注意,这段代码经过babel编译,结果会是:undefined, undefined, 123, true,不会报错,因为babel是使用var去最大限度模拟let
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句