From 95a96f42e85757c07c3bd6f5485045b6d130028c Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 10:19:57 +0800 Subject: [PATCH 01/31] vault backup: 2022-05-17 10:19:57 --- 深入探索 JavaScript/JavaScript 执行.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index c6c5c39..4baf115 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -49,4 +49,7 @@ o.showThis(); // o 函数能够引用定义时的变量,函数也能记住定义时的 this,因此,函数内部必然有一个机制来保存这些信息,这个用来保存定义时上下文的机制就是私有属性 \[\[Environment\]\]。 -在函数定义时,会保存定义时的上下文为函数的 \[\[Environment\]\],而在函数执行时,会创建一条新的执行环境记录,也就是函数执行时的上下文被设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 \ No newline at end of file +在函数定义时,会保存定义时的上下文为函数的 \[\[Environment\]\],而在函数执行时,会创建一条新的执行环境记录,也就是函数执行时的上下文被设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 + +## 上下文栈 +>JavaScript 引擎并非一行一行执行代码,而是yi'duan'y \ No newline at end of file From 6600dee95af1892da1baa1ea85317d1a9a18fd4b Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 10:24:57 +0800 Subject: [PATCH 02/31] vault backup: 2022-05-17 10:24:57 --- 深入探索 JavaScript/JavaScript 执行.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 4baf115..b0e9882 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,4 +52,5 @@ o.showThis(); // o 在函数定义时,会保存定义时的上下文为函数的 \[\[Environment\]\],而在函数执行时,会创建一条新的执行环境记录,也就是函数执行时的上下文被设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 ## 上下文栈 ->JavaScript 引擎并非一行一行执行代码,而是yi'duan'y \ No newline at end of file + +>JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 \ No newline at end of file From 8756cbab21d7859e2786b937a3cde35ff6d46ff4 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 10:44:58 +0800 Subject: [PATCH 03/31] vault backup: 2022-05-17 10:44:58 --- 深入探索 JavaScript/JavaScript 执行.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index b0e9882..748e63c 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -49,7 +49,7 @@ o.showThis(); // o 函数能够引用定义时的变量,函数也能记住定义时的 this,因此,函数内部必然有一个机制来保存这些信息,这个用来保存定义时上下文的机制就是私有属性 \[\[Environment\]\]。 -在函数定义时,会保存定义时的上下文为函数的 \[\[Environment\]\],而在函数执行时,会创建一条新的执行环境记录,也就是函数执行时的上下文被设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 +在函数执行时,会创建一条执行环境记录,也就是函数定义时的上下文设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 ## 上下文栈 From 8c3b895e525f7b9a61b6e827d62d56e63bafd39f Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 10:49:58 +0800 Subject: [PATCH 04/31] vault backup: 2022-05-17 10:49:58 --- 深入探索 JavaScript/JavaScript 执行.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 748e63c..3776be1 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -47,10 +47,14 @@ o.showThis(); // o 如果将例子中的 showThis 函数改写为类中的方法,那么直接调用 showThis 方法的 this 的结果也会不同,这是因为 JavaScript 的 Class 被设计成了默认在严格模式下(use strict)执行,而严格模式下 this 指向会发生一些改变。 -函数能够引用定义时的变量,函数也能记住定义时的 this,因此,函数内部必然有一个机制来保存这些信息,这个用来保存定义时上下文的机制就是私有属性 \[\[Environment\]\]。 - -在函数执行时,会创建一条执行环境记录,也就是函数定义时的上下文设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,着一层一层形成的上下文就是函数的 **“作用域链”**。 +this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] ## 上下文栈 ->JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 \ No newline at end of file +>JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 + +函数能够引用定义时的变量,函数也能记住定义时的 this,因此,函数内部必然有一个机制来保存这些信息,这个用来保存定义时上下文的机制就是私有属性 \[\[Environment\]\]。 + +在函数执行时,会创建一条执行环境记录,也就是函数定义时的上下文设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,无论函数以何种形式被调用,变量都会依照定义时的环境被查找出来。 + +JavaScript 用一个栈来管理执行上下文,当函数调用时,会入栈一个新的执行上下文,函数调用结束之后,执行上下文被出栈 \ No newline at end of file From 478570f812556441d0887c6f59292a2d32d8364a Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 10:54:58 +0800 Subject: [PATCH 05/31] vault backup: 2022-05-17 10:54:58 --- 深入探索 JavaScript/JavaScript 执行.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 3776be1..9024fdb 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -47,7 +47,10 @@ o.showThis(); // o 如果将例子中的 showThis 函数改写为类中的方法,那么直接调用 showThis 方法的 this 的结果也会不同,这是因为 JavaScript 的 Class 被设计成了默认在严格模式下(use strict)执行,而严格模式下 this 指向会发生一些改变。 -this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] +this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] 私有属性,这个属性有以下三种取值: +- lexical - 表示从上下文中找 this,对应箭头函数。 +- global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 +- strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null ## 上下文栈 From de75257a8f67adc3af7dc00507cb3e2c829c0516 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:04:58 +0800 Subject: [PATCH 06/31] vault backup: 2022-05-17 11:04:58 --- 深入探索 JavaScript/JavaScript 执行.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 9024fdb..f1c652b 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,6 +52,8 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] - global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 - strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null +实际上 this 也可以看作是 + ## 上下文栈 >JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 From 7f39be9982c4e529e2827ca1565f95b76cca14b0 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:14:58 +0800 Subject: [PATCH 07/31] vault backup: 2022-05-17 11:14:58 --- 深入探索 JavaScript/JavaScript 执行.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index f1c652b..b70d592 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,7 +52,7 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] - global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 - strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null -实际上 this 也可以看作是 +实际上 this 也可以看作是和词法 ## 上下文栈 From 1e598cad655e4cfdc15fb66df2616503dd1d1c8e Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:19:59 +0800 Subject: [PATCH 08/31] vault backup: 2022-05-17 11:19:59 --- 深入探索 JavaScript/JavaScript 执行.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index b70d592..e22b802 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,7 +52,7 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] - global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 - strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null -实际上 this 也可以看作是和词法 +实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者的引用压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this(指向调用外部函数的普通对象或 global)。 ## 上下文栈 From 4eed6f43c77870b630d179e80eef2ce67e184633 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:24:59 +0800 Subject: [PATCH 09/31] vault backup: 2022-05-17 11:24:59 --- 深入探索 JavaScript/JavaScript 执行.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index e22b802..258e783 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,7 +52,7 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] - global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 - strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null -实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者的引用压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this(指向调用外部函数的普通对象或 global)。 +实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者的引用压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this。 ## 上下文栈 From f87e2d6d7d2235b31788528ed8ae88b394a4bb0b Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:29:59 +0800 Subject: [PATCH 10/31] vault backup: 2022-05-17 11:29:59 --- 深入探索 JavaScript/JavaScript 执行.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 258e783..b360dc2 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -52,7 +52,7 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] - global - 表示当 this 为 underfined 时,取全局对象,对应普通函数。 - strict - 当严格模式时使用,this 严格按照调用时传入的值,可能为 underfined 或 null -实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者的引用压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this。 +实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this。 ## 上下文栈 @@ -62,4 +62,6 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] 在函数执行时,会创建一条执行环境记录,也就是函数定义时的上下文设置为函数的 \[\[Environment\]\],这个动作就是切换上下文,无论函数以何种形式被调用,变量都会依照定义时的环境被查找出来。 -JavaScript 用一个栈来管理执行上下文,当函数调用时,会入栈一个新的执行上下文,函数调用结束之后,执行上下文被出栈 \ No newline at end of file +JavaScript 用一个栈来管理执行上下文,当函数调用时,会入栈一个新的执行上下文,函数调用结束之后,执行上下文被出栈 + +数创建新的执行上下文中的词法环境记录时,会根据 \[\[thisMode\]\] 来标记新纪录的\[\[ThisBindingStatus\]\] 私有属性。 \ No newline at end of file From 2fc00a7b7a720e18aa2bfc8c0d8f36be962088d3 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:35:00 +0800 Subject: [PATCH 11/31] vault backup: 2022-05-17 11:35:00 --- 深入探索 JavaScript/JavaScript 执行.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index b360dc2..6160190 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -64,4 +64,6 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] JavaScript 用一个栈来管理执行上下文,当函数调用时,会入栈一个新的执行上下文,函数调用结束之后,执行上下文被出栈 -数创建新的执行上下文中的词法环境记录时,会根据 \[\[thisMode\]\] 来标记新纪录的\[\[ThisBindingStatus\]\] 私有属性。 \ No newline at end of file +this 的值存放在私有属性 \[\[ThisBindingStatus\]\] 中 + +函数创建新的执行上下文中的词法环境记录时,会根据 \[\[thisMode\]\] 来标记新纪录的 \[\[ThisBindingStatus\]\] 私有属性。代码执行遇到 this 时,会逐层检查当前词法环境记录中的 \[\[ThisBindingStatus\]\],当找到有 this 的环境记录时获取 this 的值。 \ No newline at end of file From f80f879e3e96b7142241c8649deafab79694494a Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:51:20 +0800 Subject: [PATCH 12/31] vault backup: 2022-05-17 11:51:20 --- 深入探索 JavaScript/JavaScript 执行.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 6160190..4413c16 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -54,6 +54,8 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] 实际上 this 也可以看作是在调用时被确认的词法环境,普通函数被调用时会将 this 指向调用者压入执行上下文栈,但箭头函数不会创建新的词法环境,因此箭头函数中的 this 将从词法环境中查找并继承(复用)其定义时外部函数的 this。 +JavaScript 提供了可以操作 this 的内置函数,如 Function.prototype.call 和 Function.prototype.apply,它们可以指定函数调用时传入的 this,除此之外还有 Function.prototype.bind,它可以返回一个更改了 this 的函数,它们甚至可以应用在箭头函数中,但是它并不会修改 this,仅仅实现了传参的能力。 + ## 上下文栈 >JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 From dc4b0aef0dd505eced6dd6e9c4cbfc6143d17f44 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 11:56:20 +0800 Subject: [PATCH 13/31] vault backup: 2022-05-17 11:56:20 --- 深入探索 JavaScript/JavaScript 执行.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 4413c16..14a8e9d 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -56,6 +56,13 @@ this 是一个复杂的机制,JavaScript 标准定义了 \[\[ thisMode \]\] JavaScript 提供了可以操作 this 的内置函数,如 Function.prototype.call 和 Function.prototype.apply,它们可以指定函数调用时传入的 this,除此之外还有 Function.prototype.bind,它可以返回一个更改了 this 的函数,它们甚至可以应用在箭头函数中,但是它并不会修改 this,仅仅实现了传参的能力。 +Kyle Simpson 关于 this 的总结: +1. 如果由new调用 - 绑定到新创建的对象 +2. 如果由 call、apply 或 bind调用 - 绑定到指定的对象 +3. 如果由上下文对象调用 - 绑定到那个上下文对象 +4. 其他调用情况 - 严格模式下会绑定到 undefined,非严格模式绑定到全局对象 +5. 以上情况对于箭头函数都不适用,它会继承外层函数的 this 绑定 + ## 上下文栈 >JavaScript 引擎并非一行一行分析执行代码,而是一段一段的分析执行,当执行一段代码的时候会进行一些准备工作 From 9fca5ebb46d0c4c1491a109bddbc4637b252c5dd Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:24:20 +0800 Subject: [PATCH 14/31] vault backup: 2022-05-17 14:24:20 --- 深入探索 JavaScript/JavaScript 执行.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 14a8e9d..647d7bc 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -75,4 +75,8 @@ JavaScript 用一个栈来管理执行上下文,当函数调用时,会入栈 this 的值存放在私有属性 \[\[ThisBindingStatus\]\] 中 -函数创建新的执行上下文中的词法环境记录时,会根据 \[\[thisMode\]\] 来标记新纪录的 \[\[ThisBindingStatus\]\] 私有属性。代码执行遇到 this 时,会逐层检查当前词法环境记录中的 \[\[ThisBindingStatus\]\],当找到有 this 的环境记录时获取 this 的值。 \ No newline at end of file +函数创建新的执行上下文中的词法环境记录时,会根据 \[\[thisMode\]\] 来标记新纪录的 \[\[ThisBindingStatus\]\] 私有属性。代码执行遇到 this 时,会逐层检查当前词法环境记录中的 \[\[ThisBindingStatus\]\],当找到有 this 的环境记录时获取 this 的值。 + +## Completion Record / 完成标记 + +>Completion Record 是 JavaScript 中的一个标准类型,用于描述异常、跳出等语句执行过程, \ No newline at end of file From 667012ba2941daca962beb48f2b8a6a2ff2f930f Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:29:20 +0800 Subject: [PATCH 15/31] vault backup: 2022-05-17 14:29:20 --- 深入探索 JavaScript/JavaScript 执行.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 647d7bc..7b92cc0 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -79,4 +79,4 @@ this 的值存放在私有属性 \[\[ThisBindingStatus\]\] 中 ## Completion Record / 完成标记 ->Completion Record 是 JavaScript 中的一个标准类型,用于描述异常、跳出等语句执行过程, \ No newline at end of file +>Completion Record 是 JavaScript 中的一个规范类型,用于描述异常、跳出等语句执行过程 \ No newline at end of file From fd80ddb2fca5957c84d761591941d2d52fce8fff Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:34:20 +0800 Subject: [PATCH 16/31] vault backup: 2022-05-17 14:34:20 --- 深入探索 JavaScript/JavaScript 执行.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 7b92cc0..595877f 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -79,4 +79,9 @@ this 的值存放在私有属性 \[\[ThisBindingStatus\]\] 中 ## Completion Record / 完成标记 ->Completion Record 是 JavaScript 中的一个规范类型,用于描述异常、跳出等语句执行过程 \ No newline at end of file +>Completion Record 是 JavaScript 中的一个规范类型,用于描述异常、跳出等语句执行过程 + +Completion Record 是语言实现者才需要关心的内容,但是我们可以从中看出一些 JavaScript 更加底层的实现逻辑,它有着三个字段分别是: +- \[\[type\]\] - 表示完成的类型,有 break continue return throw 和 normal 几种类型 +- \[\[value\]\] - 表示语句的返回值,如果语句没有,则是 empty +- \[\[target\]\] - 表示语句的目标,通常是一个 JavaScript biao'qi'a \ No newline at end of file From e9dfba5c73188c20575c559e8875f285521aa889 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:39:21 +0800 Subject: [PATCH 17/31] vault backup: 2022-05-17 14:39:21 --- 深入探索 JavaScript/JavaScript 执行.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 执行.md b/深入探索 JavaScript/JavaScript 执行.md index 595877f..48edbc9 100644 --- a/深入探索 JavaScript/JavaScript 执行.md +++ b/深入探索 JavaScript/JavaScript 执行.md @@ -84,4 +84,11 @@ this 的值存放在私有属性 \[\[ThisBindingStatus\]\] 中 Completion Record 是语言实现者才需要关心的内容,但是我们可以从中看出一些 JavaScript 更加底层的实现逻辑,它有着三个字段分别是: - \[\[type\]\] - 表示完成的类型,有 break continue return throw 和 normal 几种类型 - \[\[value\]\] - 表示语句的返回值,如果语句没有,则是 empty -- \[\[target\]\] - 表示语句的目标,通常是一个 JavaScript biao'qi'a \ No newline at end of file +- \[\[target\]\] - 表示语句的目标,通常是一个 JavaScript 标签 + +JavaScript 正是依靠语句的 Completion Record 类型,方才可以在语句的复杂嵌套结构中,实现各种控制,普通语句执行后,会得到 \[\[type\]\] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句。 + +这些语句中,只有表达式语句会产生 \[\[value\]\],当然,从引擎控制的角度,这个 value 并没有什么用处,Chrome 控制台显示的正是语句的 Completion Record 的 \[\[value\]\] + +参考文章: +- http://www.ecma-international.org/ecma-262/#sec-ecmascript-specification-types \ No newline at end of file From 2ba603c4d9ba9bf596a928a39be1c876bcae2fc9 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:49:21 +0800 Subject: [PATCH 18/31] vault backup: 2022-05-17 14:49:21 --- 深入探索 JavaScript/碎片记录.md | 1 + 1 file changed, 1 insertion(+) diff --git a/深入探索 JavaScript/碎片记录.md b/深入探索 JavaScript/碎片记录.md index e69de29..1c879a7 100644 --- a/深入探索 JavaScript/碎片记录.md +++ b/深入探索 JavaScript/碎片记录.md @@ -0,0 +1 @@ +- `12.toString()` 会报错,这是因为 JavaScript 允许 Number 省略小数点前或者后,`12.toString()` 中的 `12.` 会被当作省略了小数点后的整体,如果想要这一句zhen \ No newline at end of file From 45592267ab29b3f07e66684d0ccecee2c18f16a1 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:54:21 +0800 Subject: [PATCH 19/31] vault backup: 2022-05-17 14:54:21 --- 深入探索 JavaScript/碎片记录.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/碎片记录.md b/深入探索 JavaScript/碎片记录.md index 1c879a7..67da50b 100644 --- a/深入探索 JavaScript/碎片记录.md +++ b/深入探索 JavaScript/碎片记录.md @@ -1 +1,2 @@ -- `12.toString()` 会报错,这是因为 JavaScript 允许 Number 省略小数点前或者后,`12.toString()` 中的 `12.` 会被当作省略了小数点后的整体,如果想要这一句zhen \ No newline at end of file +- `12.toString()` 会报错,这是因为 JavaScript 允许10进制 Number 省略小数点前或者后,`12.toString()` 中的 `12.` 会被当作省略了小数点后的数字,如果想要这一句正常工作,需要在中间加个空格:`12. toString()` +- 模板支持添加处理函数的写法,这时模板的各段会被拆开,传递给函数当参数: \ No newline at end of file From e0f562f173e301fcc037dde59fa12f1976fff771 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 14:59:21 +0800 Subject: [PATCH 20/31] vault backup: 2022-05-17 14:59:21 --- 深入探索 JavaScript/碎片记录.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/深入探索 JavaScript/碎片记录.md b/深入探索 JavaScript/碎片记录.md index 67da50b..75e80a6 100644 --- a/深入探索 JavaScript/碎片记录.md +++ b/深入探索 JavaScript/碎片记录.md @@ -1,2 +1,11 @@ -- `12.toString()` 会报错,这是因为 JavaScript 允许10进制 Number 省略小数点前或者后,`12.toString()` 中的 `12.` 会被当作省略了小数点后的数字,如果想要这一句正常工作,需要在中间加个空格:`12. toString()` -- 模板支持添加处理函数的写法,这时模板的各段会被拆开,传递给函数当参数: \ No newline at end of file +- `12.toString()` 会报错,这是因为 JavaScript 允许10进制 Number 省略小数点前或者后,`12.toString()` 中的 `12.` 会被当作省略了小数点后的数字,如果想要这一句正常工作,需要在中间加个空格:`12 .toString()` 或是 `12..toString()` +- 模板支持添加处理函数的写法,这时模板的各段会被拆开,传递给函数当参数: + +```javascript +function f(){ + console.log(arguments); +} + +var a = "world" +f`Hello ${a}!`; // [["Hello", "!"], world] +``` \ No newline at end of file From 2a419c5cf2bcb4ff0f68b0b7b34d11a9cbd1fcc5 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 15:09:21 +0800 Subject: [PATCH 21/31] vault backup: 2022-05-17 15:09:21 --- 深入探索 JavaScript/JavaScript 语法.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 深入探索 JavaScript/JavaScript 语法.md diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md new file mode 100644 index 0000000..e69de29 From 1cb0c80ed0d7bcf1c1ed30861d40e9faf5f3ca2f Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 15:19:21 +0800 Subject: [PATCH 22/31] vault backup: 2022-05-17 15:19:21 --- 深入探索 JavaScript/JavaScript 语法.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 深入探索 JavaScript/JavaScript 语法.md diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md deleted file mode 100644 index e69de29..0000000 From e6dbc0d49f9f25e3e35a73850f36eab13cc4a3bd Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 15:24:21 +0800 Subject: [PATCH 23/31] vault backup: 2022-05-17 15:24:21 --- 深入探索 JavaScript/JavaScript 语法.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 深入探索 JavaScript/JavaScript 语法.md diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md new file mode 100644 index 0000000..6d12385 --- /dev/null +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -0,0 +1,10 @@ +## import 声明 + +import 声明有两种用法,一个是直接 import 一个模块,另一个是带 from 的 import,它能引入模块里的一些信息。 + +```javascript +import "mod"; //引入一个模块 +import v from "mod"; //把模块默认的导出值放入变量v +``` + +直接 import 一个模块,只是保证了这个模块代码被执行,引用它的模块是无法获得它的任何信息的,而带 from 的 import 意思是引入模块中的一部分信息,可以把它们变成本地的变量。 \ No newline at end of file From a120dab1bf1520aaf66ec0ca464265fa012ea687 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 15:29:22 +0800 Subject: [PATCH 24/31] vault backup: 2022-05-17 15:29:22 --- 深入探索 JavaScript/JavaScript 语法.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 6d12385..53d5da6 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -7,4 +7,6 @@ import "mod"; //引入一个模块 import v from "mod"; //把模块默认的导出值放入变量v ``` -直接 import 一个模块,只是保证了这个模块代码被执行,引用它的模块是无法获得它的任何信息的,而带 from 的 import 意思是引入模块中的一部分信息,可以把它们变成本地的变量。 \ No newline at end of file +直接 import 一个模块,只是保证了这个模块代码被执行,引用它的模块是无法获得它的任何信息的,而带 from 的 import 意思是引入模块中的一部分信息,可以把它们变成本地的变量。 + +导入相当于是一个引用,仍然指向同一个地址。 \ No newline at end of file From d03c648a6fd00df32d53be8038a1e5f3814232c2 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 16:46:20 +0800 Subject: [PATCH 25/31] vault backup: 2022-05-17 16:46:20 --- 深入探索 JavaScript/JavaScript 语法.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 53d5da6..96f1f69 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -9,4 +9,6 @@ import v from "mod"; //把模块默认的导出值放入变量v 直接 import 一个模块,只是保证了这个模块代码被执行,引用它的模块是无法获得它的任何信息的,而带 from 的 import 意思是引入模块中的一部分信息,可以把它们变成本地的变量。 -导入相当于是一个引用,仍然指向同一个地址。 \ No newline at end of file +独立的 `export` 导入相当于是一个引用,导出的变量仍然指向同一个地址(无关引用类型和值类型)。 + +而 `export default` 导出的则是一个值,但是对于引用了类型而言,也是会被修改的 \ No newline at end of file From 696eaa2a72dc3e03ae79584161fdb70a46c80eb3 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 16:51:20 +0800 Subject: [PATCH 26/31] vault backup: 2022-05-17 16:51:20 --- 深入探索 JavaScript/JavaScript 语法.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 96f1f69..5494cb0 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -11,4 +11,4 @@ import v from "mod"; //把模块默认的导出值放入变量v 独立的 `export` 导入相当于是一个引用,导出的变量仍然指向同一个地址(无关引用类型和值类型)。 -而 `export default` 导出的则是一个值,但是对于引用了类型而言,也是会被修改的 \ No newline at end of file +而 `export default` 导出的则是一个值,但是对于引用类型而言,也是会被修改的 \ No newline at end of file From d667df029d35948b4f1a8d184731ccf40379b91e Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 17:12:57 +0800 Subject: [PATCH 27/31] vault backup: 2022-05-17 17:12:57 --- 深入探索 JavaScript/JavaScript 语法.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 5494cb0..c38e3dd 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -11,4 +11,8 @@ import v from "mod"; //把模块默认的导出值放入变量v 独立的 `export` 导入相当于是一个引用,导出的变量仍然指向同一个地址(无关引用类型和值类型)。 -而 `export default` 导出的则是一个值,但是对于引用类型而言,也是会被修改的 \ No newline at end of file +而 `export default` 导出的则是一个值,但是对于引用类型而言,也是会被修改的 + +## var 声明的预处理 + +>var 在预处理阶段,不关心赋值的部分,只管在当前作用域声明这个变量 \ No newline at end of file From 2d32a1b6f0a6f49c6665d583deb9bc35b7484dd1 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 17:17:58 +0800 Subject: [PATCH 28/31] vault backup: 2022-05-17 17:17:57 --- 深入探索 JavaScript/JavaScript 语法.md | 31 +++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index c38e3dd..17eeca1 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -15,4 +15,33 @@ import v from "mod"; //把模块默认的导出值放入变量v ## var 声明的预处理 ->var 在预处理阶段,不关心赋值的部分,只管在当前作用域声明这个变量 \ No newline at end of file +>var 在预处理阶段,不关心赋值的部分,只管在当前作用域声明这个变量 + +```javascript +var a = 1; +function foo() { + console.log(a); // undefined + + // var 会穿透一切语言结构 + if(false) { + var a = 2; + } +} + +foo(); +``` + +## function 声明 + +>function 声明表现跟 var 相似,不同之处在于,function 声明不但在作用域中加入变量,还会给它赋值。 + +看一个与之不同的例子: + +```javascript +// foo 会被提升,但不会被赋值 +console.log(foo); // undefined + +if(true) { + function foo(){ } +} +``` \ No newline at end of file From a316a383ab21e1c29da0022f7272ffdf7ac594dd Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 17:22:57 +0800 Subject: [PATCH 29/31] vault backup: 2022-05-17 17:22:57 --- 深入探索 JavaScript/JavaScript 语法.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 17eeca1..7d0e360 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -44,4 +44,8 @@ console.log(foo); // undefined if(true) { function foo(){ } } -``` \ No newline at end of file +``` + +## class 声明 + +class 声明也是存在预处理的,但是它的行为会更加的符合直觉, \ No newline at end of file From 896ee922b559f775bac75c766f903de77ddb46f5 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 17:27:57 +0800 Subject: [PATCH 30/31] vault backup: 2022-05-17 17:27:57 --- 深入探索 JavaScript/JavaScript 语法.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/JavaScript 语法.md b/深入探索 JavaScript/JavaScript 语法.md index 7d0e360..eeac0dc 100644 --- a/深入探索 JavaScript/JavaScript 语法.md +++ b/深入探索 JavaScript/JavaScript 语法.md @@ -48,4 +48,10 @@ if(true) { ## class 声明 -class 声明也是存在预处理的,但是它的行为会更加的符合直觉, \ No newline at end of file +class 声明也是存在预处理的,但是它的行为会更加的符合直觉,更倾向于抛出错误 + +## 指令序言机制 + +"use strict"是 JavaScript 标准中规定的唯一一种指令序言,但是设计指令序言的目的是,留给 JavaScript 的引擎和实现者一些统一的表达方式,在静态扫描时指定 JavaScript 代码的一些特性。 + +JavaScript 的指令序言是只有一个字符串直接量的表达式语句,它只能出现在脚本、模块和函数体的最前面。 \ No newline at end of file From 7ae64e8663700d18fa8dc0ed2beb0be8d8f17a05 Mon Sep 17 00:00:00 2001 From: YuJian Date: Tue, 17 May 2022 17:32:57 +0800 Subject: [PATCH 31/31] vault backup: 2022-05-17 17:32:57 --- 深入探索 JavaScript/碎片记录.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/深入探索 JavaScript/碎片记录.md b/深入探索 JavaScript/碎片记录.md index 75e80a6..1cc5e24 100644 --- a/深入探索 JavaScript/碎片记录.md +++ b/深入探索 JavaScript/碎片记录.md @@ -8,4 +8,7 @@ function f(){ var a = "world" f`Hello ${a}!`; // [["Hello", "!"], world] -``` \ No newline at end of file +``` + +- JavaScript switch 语句继承自 Java,Java 中的 switch 语句继承自 C 和 C++,原本 switch 语句是跳转的变形,所以我们如果要用它来实现分支,必须要加上 break。 +- 在 C 时代,switch 生成的汇编代码性能是略优于 if else 的,但是对 JavaScript 来说,则无本质区别。 \ No newline at end of file