this

89 阅读1分钟

绑定方式

1.默认绑定:
    function foo() {
        console.log( this.a ); // this -> window
    }
    var a = 2;
    foo(); // 2
    注意:严格模式下,绑定到undefined

2.隐式绑定:
    function foo() {
        console.log( this.a );
    }
    var obj = {
        a: 2,
        foo: foo
    };
    obj.foo(); // 2

3.显示绑定:apply/call/bind
    function foo() {
        console.log( this.a );
    }
    var obj = {
        a: 2
    }
    foo.call(obj)
    
4.硬绑定:bind
    function foo() {
        console.log( this.a );
    }
    var obj = {
        a: 2
    }
    // 硬绑定无法再修改其this
    // 每次进入都会指定绑定
    // es5中因此类似出了一个bind()
    var bar = foo.bind(obj)
    var b = bar(3)

5.new绑定:
    new的执行过程:
        1.创建一个全新对象;
        2.新对象会被执行[[原型]]连接;
        3.新对象绑定到函数调用的this4.自动返回新对象;

优先级: new > bind > apply/call > 隐式 > 默认

额外

function.apply(null)/function.apply(undefined):
    副作用:如果某个函数确实使用了this,则会默认把this绑定到全局;
    推荐使用:function.apply(Object.create(null))

注意

this在运行时绑定的,并非在编写时确定;
this的绑定和函数声明位置无任何关系,只取决于函数的调用方式;