Skip to content

Commit 5660dcf

Browse files
张东张东
张东
authored and
张东
committed
添加词法环境
1 parent 045cf69 commit 5660dcf

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

.vitepress/config.mts

+4
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ export default defineConfig({
186186
text: "冒泡与捕获",
187187
link: "/javascript/grammar/bubbling",
188188
},
189+
{
190+
text: "词法环境",
191+
link: "/javascript/grammar/lexicalEnvironment",
192+
},
189193
],
190194
},
191195
],
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
outline: deep
3+
layout: doc
4+
---
5+
函数,块级,全局作用域都有一个被称为词法环境的内部隐藏的关联对象
6+
7+
::: tip :rocket: 注意
8+
对象的{}不是一个词法环境
9+
:::
10+
11+
词法环境对象由两部分组成:
12+
13+
1. 环境记录(Environment Record) —— 一个存储所有局部变量作为其属性(包括一些其他信息,例如 `this` 的值)的对象。
14+
2. 对 外部词法环境 的引用,与外部代码相关联。
15+
16+
内部词法环境是动态的,但是外部词法环境的引用是创建时拿到的。因为this是内部词法环境的内容,所以this是可变的
17+
18+
`当代码要访问一个变量时 —— 首先会搜索内部词法环境,然后搜索外部环境,然后搜索更外部的环境,以此类推,直到全局词法环境`
19+
20+
## this指向规则
21+
<img src="https://s2.loli.net/2025/01/06/G7uqQCjTLR9OgWk.webp" >
22+
23+
### 第三条
24+
<img src="https://s2.loli.net/2025/01/06/ER32HgnVFTuAzZ5.webp" >
25+
26+
### 第五条
27+
```js
28+
let user = {
29+
firstName: "John",
30+
sayHi() {
31+
alert(`Hello, ${this.firstName}!`);
32+
}
33+
};
34+
35+
setTimeout(user.sayHi, 1000); // Hello, undefined!
36+
37+
//等于
38+
let f = user.sayHi;
39+
setTimeout(f, 1000); // 丢失了 user 上下文
40+
```

0 commit comments

Comments
 (0)