重学es6

let 讲解

2020-08-13  本文已影响0人  zhang463291046

以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途

let常见错误写法

{
  console.log(a)  // ReferenceError: Cannot access 'a' before initialization
  let a = 1;
  var a = 1;  // SyntaxError: Identifier 'a' has already been declared
  console.log(a)  //  1
}
console.log(a)  // ReferenceError: a is not defined.
var a = 1
{
   a = 2      //ReferenceError: Cannot access 'a' before initialization
   let a = 3
}
function func(a) {
  let a;    //  同作用域下已经被声明为形参
}
func() // SyntaxError: Identifier 'a' has already been declared

for循环特别之处,设置循环变量的是一个父作用域,而循环体内部是一个单独的子作用域。循环变量i与函数内部的变量i不在同一个作用域,有各自单独的作用域

for (let i = 0; i < 3; i++) {
  console.log(i);  //父作用域值
}
// 0
// 1
// 2
for (let i = 0; i < 3; i++) {
  let i = 5;
  console.log(i);  //子作用域值
}
// 5
// 5
// 5

块级作用域{},每个块都有单独的作用域

// IIFE 写法
(function () {
  var tmp = ...;
  ...
}());

// 块级作用域写法
{
  let tmp = ...;
  ...
}
// 块级作用域内部的函数声明语句,建议不要使用
{
  let a = 'secret';
  function f() {
    return a;
  }
}

// 块级作用域内部,优先使用函数表达式
{
  let a = 'secret';
  let f = function () {
    return a;
  };
}

const用法与上面讲解的let基本一致,除了以下这点

const a   // SyntaxError: Missing initializer in const declaration
const b = 1 
b = 2  // TypeError: Assignment to constant variable
const a = {}
a.c = 1   //不会报错,因为地址没有变
a = {}  //TypeError: Assignment to constant variable.
上一篇下一篇

猜你喜欢

热点阅读