JavaScript 高级程序设计第四版阅读笔记(一)

141 阅读2分钟

DOM

文档对象模型,DOM,DOM 将整个页面抽象为一组分层节点,DOM 通过创建表示文档的树,让开发者可以随心所欲地控制网页的内容与结构。使用 DOM API,可以轻松的删除、添加、替换、修改节点。

let 声明

  1. let 声明的范围是块作用域,而 var 声明的范围是函数作用域,块作用域是函数作用域的子集,因此适用于 var 的作用域限制也适用于 let
  2. let 不允许在同一个作用域中出现冗余声明,对声明冗余报错不会因混用 letvar 而受影响。
  3. let 声明的变量不会在作用域中被提升。在 let 声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用任何后面才会声明的变量都会抛出 ReferenceError
  4. 使用 let 在全局作用域中声明的变量不会称为window对象的属性(var 声明的变量则会)
  5. for 循环中的let声明,当使用 let 声明迭代变量时,JavaScript 引擎在后台为每个迭代循环声明一个新的迭代变量。每个 setTimeout 引用的都是不同的变量示例

// 2
var name;
let name;  // SyntaxError

let age;
var age;  // SyntaxError


// 5
for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i); // 0 1 2 3 4
  }, 0);
}
// 

const 声明

1、const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行时错误

const age = 30;
         age = 36; // Uncaught TypeError: Assignment to constant variable.

2、const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制

const person = {};
	person.name  = 'Wan'; // ok

3、JavaScript 引擎会为 for 循环的 let 声明分别创建独立的变量实例,虽然 const 变量跟 let 变量很相似,但是不能用 const 来声明迭代变量(因为迭代变量会自增):

for (const i = 0; i < 10; ++i) {  // TypeError: Assignment to constant variable.(给常量赋值)
  console.log(i)
}

4、如果你只想用 const 声明一个不会被修改的 for 循环变量,那也是可以的。也就是说,每次迭代只是创建一个新变量。这对 for-of 和 for-in 循环特别有意义

let i = 0;
for (const j = 7; i < 5; ++i) {
  console.log(j); // 7, 7, 7, 7, 7
}

for (const key in {a: 1, b: 2}) {
  console.log(key); // a, b
}
for (const value of [1, 2, 3, 4, 5]) {
  console.log(value); // 1, 2, 3, 4, 5
}