首先:this有一个误解,实际上this在许多时候是不指向自身的,用call可以确保this指向函数对象本身
this的绑定有四种
-
默认绑定:不带任何修饰的函数引用进行调用,为默认规则
-
隐式绑定:使用上下文对象来调用它
出现常见的this绑定问题:被隐式绑定的函数会丢失绑定对象,从而应用默认绑定将this绑定到全局对象/undefined
-
显示绑定:用apply/call 强制绑定/硬绑定
硬绑定ES5内置:
Function.prototype.bind
-
new绑定:用new初始化类调用类中构造函数时,四个步骤
创建一个全新对象 => 对象被执行原型连接 => 绑定到函数调用的this => 若函数没有返回其他对象,则new中函数调用会自动返回该新对象
优先级:
调用new的则绑定的是新对象 =no=> 显式绑定/硬绑定则为指定的对象 =no=>隐式绑定则绑定的是上下文对象 =no=> 默认绑定严格模式下为绑定undefined,否则为全局对象
例外情况:
-
把null/undefined作为this的绑定对象传入call、apply、bind中调用会被忽略,实际应用默认绑定规则,但有可能产生副作用,一个🌰:
Math.max.apply(null,arr);//求极值时可用
-
”更安全“的做法是传入一个特殊的对象,this绑定上不会产生任何副作用,如₡
₡=Object.create(null);
-
箭头函数:内部this绑定无法被修改(new也不行),不使用this的四种标准规则,而是根据外层作用域来决定this