明月,高高挂天边;思念,慢慢积成山;回忆,幕幕显眼前;渴望,年年你我圆。祝你中秋节快乐!
大家中秋快乐, 中秋佳节还是要吃月饼滴,我今天可是吃了五个月饼。哈哈哈,言归正传,节日是节日,该学习还是要学习的
接上回 关于this
2.3.1硬绑定
显示绑定的一个变种:
function foo(){
console.log(this.a) ;
}
var obj = {
a: 2
} ;
var fn = function( {
foo.call(obj);
};
fn(); // 2
setTimeout(fn,100); // 2
//硬绑定的bar不可能再修改它的thisfn.call(window);// 2
创建了函数fn(),并在它的内部手动调用了foo.call(obj),因此强制把foo的this绑定到了obj。无论之后如何调用函数fn,它总会手动在obj上调用foo。这种绑定是一种显式的强制绑定,因此我们称之为硬绑定。
硬绑定是一种非常常用的模式,所以es5中有个方法为Function.prototype.bind
bind(..)会返回一个硬编码的新函数,它会把你指定的参数设置为this的上下文并调用原始函数。
2.3.2软绑定
使用硬绑定之后就无法使用隐式绑定或者显式绑定来修改this。所以就有了另一种方法,也就是软绑定
softBind(..)的其他原理和ES5内置的bind(..)类似。它会对指定的函数进行封装,首先检查调用时的this,如果this绑定到全局对象或者undefined,那就把指定的默认对象obj绑定到this,否则不会修改this。
2.4 new绑定
使用new构造函数时,会执行4步操作
1.创建一个全新的对象。
2.这个新对象会被执行[[Prototype]]连接。
3.这个新对象会绑定到函数调用的this。
4.如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
new绑定对大家来说很简单,我也就不一一例举代码了
3.优先级
关于this优先级,分别为new优先,显示绑定(硬绑定)次之,隐式绑定再次之,默认绑定最后
判断this现在我们可以根据优先级来判断函数在某个调用位置应用的是哪条规则。可以按照下面的顺序来进行判断:
1.函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。
2.函数是否通过call、apply(显式绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象。
3.函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。
4.如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。
这是一般的函数调用,但凡事总有例外,有些情况就会忽略。
虽说开头已经说了一遍,但是不足以表达我的祝福之情,我就再说一遍了,各位大佬中秋快乐,有什么意见直接评论就行,我会改进