File tree Expand file tree Collapse file tree 1 file changed +29
-0
lines changed Expand file tree Collapse file tree 1 file changed +29
-0
lines changed Original file line number Diff line number Diff line change @@ -869,6 +869,35 @@ const cat = {
869
869
870
870
上面代码中,` cat.jumps() ` 方法是一个箭头函数,这是错误的。调用` cat.jumps() ` 时,如果是普通函数,该方法内部的` this ` 指向` cat ` ;如果写成上面那样的箭头函数,使得` this ` 指向全局对象,因此不会得到预期结果。这是因为对象不构成单独的作用域,导致` jumps ` 箭头函数定义时的作用域就是全局作用域。
871
871
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
+
872
901
第二个场合是需要动态` this ` 的时候,也不应使用箭头函数。
873
902
874
903
``` javascript
You can’t perform that action at this time.
0 commit comments