简述JS中this的指向

1.背景介绍

this 关键字是 JavaScript 中最复杂的机制之一。它是一个很特别的关键字,被自动定义在所有函数的作用域中。

this 提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将 API 设计得更加简洁并且易于复用。

2.知识剖析

this 认知误区

1 指向函数

2 指向函数作用域

// 1 指向函数
function fn1 (num) {
  this.count ++;
  console.log('count:'+num);  
}
fn1.count = 0;
for(var i =0;i <10 ;i ++) {
  if(i>5) {
    fn1(i);
  }
}
console.log(fn1.count);
// 2 指向作用域
function fn2(){
  var a= 1;
  this.fn3();
}
function fn3(){
  console.log(this.a);
}

this 的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。this 是函数调用时产生一个属性,会在函数执行的过程中用到。

this 绑定机制

每个函数的 this 是在调用时被绑定的,完全取决于函数的调用位置

1 默认绑定 2 隐式绑定 3 显示绑定 4 new绑定

// 1 默认绑定
var a = 'global';
function fn4(){
  'use strict';
  console.log(this.a);
}
// 2 隐式绑定
var obj = {
  a: 'local',
  fn: fn4,
};
// 3 显示绑定
fn4.call(obj);
fn4.apply(obj);
// 4 new绑定
function fn5(a) {
  this.a = a;
}
var obj1 = new fn5(1);
                    
                        function.call(thisArg, arg1, arg2, ...)
                        function.apply(thisArg, [argsArray])
                    
                

this 绑定方式优先级

1. 函数是否在 new 中调用(new 绑定)?如果是的话 this 绑定的是新创建的对象。

2. 函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话,this 绑定的是指定的对象。

3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。

4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。

绑定机制方法严格模式优先级
默认绑定全局调用TypeError:undefined4
隐式绑定间接调用 3
显示绑定使用call、apply方法 2
new 绑定new 调用函数 1

3.常见问题

去除 this 绑定机制

4.解决方案

使用作用域代替

                    
                        var self = this;
                        var that = this;
                    
                

5.编码实战

demo

6.扩展思考

引入第三方库之后,第三方库可能使用this,存在this绑定错误时效的可能。

7.参考文献

参考一  你不知道的JavaScript上卷

8.更多讨论

问:this 用来做什么

答:this 是对象的引用。

问:this 的绑定方法

答:1 默认绑定 2 隐式绑定 3 显示绑定 4 new绑定

问:this绑定的优先级

答:

1. 函数是否在 new 中调用(new 绑定)?如果是的话 this 绑定的是新创建的对象。

2. 函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话,this 绑定的是指定的对象。

3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。

4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined,否则绑定到全局对象。

 

 

技能树.IT修真院   

 “我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

 

快来与我一起学习吧~邀请链接 点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值