this

2017-11-08  本文已影响0人  LingJJ1100的笔记

绑定4规则:

严格模式下的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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读