js-浅析js指向-this绑定优先级及特殊情况说明

    通过之前的分析,我们可以知道常规this有哪些绑定规则,那他们如果同时出现在一个位置进行调用,优先级是怎么样的?通过实践总结,可以得出以下几条通用规则:
1. 函数是否在new中调用(new绑定)?如果是的话,this绑定的是新创建的对象;
2. 函数是否通过call,apply(显示绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象;
3. 函数是否再某个上下文对象中引用(隐式绑定)?如果是,this绑定的是那个上下文对象;
4. 如果都不是的话,使用默认绑定。如果是在严格模式下,就绑定在undefined。否则就绑定在全局变量上。

    在某些场景下,this的绑定不符合上文提到的规律。总结如下:
1. 调用call或者apply时,不希望修改this指向,而是用于其他用途,例如apply用于数组张开。此时第一个参数填入null或者绑定给一个空的非委托对象(使用Object.create()创建的对象)。此时的this会指向全局对象(在浏览器下,这个对象是window)或者空的委托对象。不推荐绑定到全局对象,会有风险;
2. 赋值的时候极易引发隐式绑定,所以要特别注意;
3. 在ES6中有一个特殊函数:箭头函数。箭头函数不是通过function关键字定义,而是使用操作符“=>”定义。它不使用this的四种标准规则,而是根据外层(函数或全局)作用域来决定this。

    为了可以更加灵活的绑定this的指向,而不是使用硬绑定强制将this绑定在一个特定的对象上,导致后期无法再次修改。可以使用一种被称为软绑定的方法:

if(!Function.prototype.softBind){
    var fn = this;
    var curried = [].slice.call(arguments,1);
    var bound = function(){
        return fn.apply(!this|| this === (window || golbal)?obj:this,
        curried.concat.apply(curried,arguments));
        };
        bound.prototype = Object.create(fn.prototype);
        return bound;
    }
}

    与ES5内置的bind(…)类似。它会对指定的函数进行封装,首先检查调用时的this,如果this绑定在全局对象或者undefined,那就会把指定的默认对象obj绑定到this上,否则不会修改this。比起硬绑定,很大程度上提高了程序的灵活性,也可以多次根据实际情况修改this指向。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值