绑定4规则:
- 调用new:this绑定到新创建的对象
- 显示绑定:使用call、apply、bind等方法
- 调用绑定:通过对象调用来绑定
-
默认绑定:直接调用,绑定到window
优先级:new-显性>调用>默认
严格模式下的this:当没有明确绑定时,是undefined,并不会默认绑定window
例外的绑定:
情况1 当call、apply、bind的this参数为null、undefined时,会进行默认绑定
更安全的 null 默认绑定:创建空对象,进行绑定,避免污染全局变量
**创建空对象: ** var ∅ = Object.create(null);
情况2(间接引用):一般出现在赋值,
function foo(){ console.log(this.a)}
var a = 1,
obj1 = { a: 2, foo: foo },
obj2 = { a: 3 };
obj1.foo() // 2
(obj2.foo = obj1.foo)(); // 1
// obj2.foo 只是获得obj1.foo函数的引用。(浅拷贝)
// obj2.foo() 相当于直接将obj1.foo函数直接在当前环境调用(全局);
箭头函数的this绑定(定义绑定):绑定到定义时的对象,并且不能被修改
相当于that = this缓存对象再传入的机制
class 与 bind(this):是调用绑定,不是定义绑定。且没有默认绑定。
在React 当没有绑定绑定this 的时候 以props(参数)的形式传入组件时候,函数是一种间接引用的关系 此时this 会丢失 将this打印出来显示undefined //React内部是严格模式?
bind(this):手动绑定class 方法的this指向
类的方法函数在其他环境单独调用,则this指向该环境
软绑定:为函数添加默认绑定 功能呢和bind类似
if(!Function.prototype.softBind){
Function.prttotype.softBind = function(obj){ // 添加全局的软绑定方法
var fn = this; // 获取调用者
var curried = [].slice.call(arguments, 1); // 获取参数
var bound = function(){
return fn.apply(
(!this || this ===(window||global))?obj:this,
curried.concat.apply(curried, arguments)
);
};
bound.prototype = Object.create(fn.prototype);
return bound;
}
}
网友评论