this

作者: LingJJ1100的笔记 | 来源:发表于2017-11-08 13:08 被阅读0次

    绑定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;
        }
    }
    

    相关文章

      网友评论

          本文标题:this

          本文链接:https://www.haomeiwen.com/subject/pvwemxtx.html