← 返回目录

第 9 卷

第 9 / 19 卷日期:

7};

8arrowFn();

9} 10};

11obj.fn(); // 张三(arrowFn的this继承自fn的this,即obj)

12 13// 定时器回调:箭头函数避免this指向全局

14obj.fn2 = function() { 15setTimeout(function() {

16console.log(this.name);//全局对象,undefined(默认绑定)
17}, 100);
18setTimeout(() => {
19console.log(this.name);//张三(继承fn2的this,即obj)
20}, 200);
21};
22obj.fn2();

(6)绑定优先级总结

new绑定 > 显式绑定(bind) > 显式绑定(call/apply) > 隐式绑定 > 默认绑定;箭头函数不遵循上述规则,其 this 由定义时的上层作用域决定。

  1. this相关的面试题的输出结果是什么?

以下是几个经典的 this 面试题及输出结果和解析,覆盖核心绑定规则:

面试题1:隐式绑定 vs 默认绑定

Code block

1const obj = { 2a: 10,

3fn: function() { 4console.log(this.a);

5} 6};

7const fn2 = obj.fn;

8obj.fn();

9fn2();

• 输出结果:

面试题2:多层隐式绑定

Code block

1const obj1 = { 2a: 10,

3obj2: { 4a: 20,

5fn: function() { 6console.log(this.a);

7} 8}

9};

10obj1.obj2.fn();

• 输出结果: 20(隐式绑定: this 指向直接调用对象 obj2,而非上层对象 obj1,访问

obj2.a=20)

面试题3:显式绑定(call/apply)

Code block

1function fn(a, b) { 2console.log(this.a, a + b);

3} 4const obj1 = { a: 10 };

5const obj2 = { a: 20 };

6fn.call(obj1, 1, 2);

7fn.apply(obj2, [3, 4]);

• 输出结果:

1.10 3( call 显式绑定 this 到 obj1,参数逐个传递, 1+2=3)

2.20 7( apply 显式绑定 this 到 obj2,参数数组传递, 3+4=7)

面试题4:bind绑定(永久绑定)

Code block

7fnBind();

8obj2.fn = fnBind;

9obj2.fn();

10fnBind.call(obj2);

• 输出结果:

1.10(bind绑定this到obj1,直接调用fnBind,this指向obj1)
2.10(即使作为obj2的方法调用,bind绑定优先级更高,this仍指向obj1)
3.10(call无法修改bind绑定的this,仍指向obj1)

面试题5:new绑定

Code block

1function Person(a) { 2this.a = a;

3this.fn = function() { 4console.log(this.a);

5};

6} 7const p1 = new Person(10);

8const p2 = new Person(20);

9p1.fn();

10p2.fn();

• 输出结果:

1.10( new 绑定: p1 是新实例, this 指向 p1, p1.a=10)

2.20( new 绑定: p2 是新实例, this 指向 p2, p2.a=20)

面试题6:箭头函数继承绑定

Code block

1const obj = { 2a: 10,

3fn: function() { 4const arrowFn = () => {

全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷