Skip to content

Commit c9eb39a

Browse files
committed
docs(function): edit arrow function
1 parent 26a241e commit c9eb39a

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

docs/function.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,35 @@ const cat = {
869869

870870
上面代码中,`cat.jumps()`方法是一个箭头函数,这是错误的。调用`cat.jumps()`时,如果是普通函数,该方法内部的`this`指向`cat`;如果写成上面那样的箭头函数,使得`this`指向全局对象,因此不会得到预期结果。这是因为对象不构成单独的作用域,导致`jumps`箭头函数定义时的作用域就是全局作用域。
871871

872+
再看一个例子。
873+
874+
```javascript
875+
globalThis.s = 21;
876+
877+
const obj = {
878+
s: 42,
879+
m: () => console.log(this.s)
880+
};
881+
882+
obj.m() // 21
883+
```
884+
885+
上面例子中,`obj.m()`使用箭头函数定义。JavaScript 引擎的处理方法是,先在全局空间生成这个箭头函数,然后赋值给`obj.m`,这导致箭头函数内部的`this`指向全局对象,所以`obj.m()`输出的是全局空间的`21`,而不是对象内部的`42`。上面的代码实际上等同于下面的代码。
886+
887+
```javascript
888+
globalThis.s = 21;
889+
globalThis.m = () => console.log(this.s);
890+
891+
const obj = {
892+
s: 42,
893+
m: globalThis.m
894+
};
895+
896+
obj.m() // 21
897+
```
898+
899+
由于上面这个原因,对象的属性建议使用传统的写法定义,不要用箭头函数定义。
900+
872901
第二个场合是需要动态`this`的时候,也不应使用箭头函数。
873902

874903
```javascript

0 commit comments

Comments
 (0)