this

185 阅读3分钟

this 的分析图

this 是什么?

this 是指当包含它的函数作为方法调用的时候所属的对象,刚开始我也有点懵B,就查gg,然后总结把它分为三句话能好理解点。

  1. 包含它的函数

  2. 作为方法被调用

  3. 所属的对象

      function showName(){
         console.log(this); //window
     }
     showName();//方法调用时
    

包含的它的函数是showName(),调用后showName()相当于window.showName()所以这里的this 就代表了window.
总结:谁调用了this,this就是谁的对象,谁最后调用了this,this就是谁的对象

那this是怎么应用的

this是由被调用的方式确定”这个事实,使得this可以被改变,从而为函数增加了动态性,可变性,使得变成更加灵活

调用位置

调用位置就指的是函数在代码中被调用的位置(不懂可看上面的代码)

5 种this 绑定全面解析

 默认绑定(严格和非严格)
 隐式绑定
 显示绑定
 new绑定
 箭头函数绑定

默认绑定

在独立的函数调用下可以把默认绑定看作this 指向群局对象,在严格模式下,this 会绑定到undifined 且调用函数不影响默认绑定

严格模式下(use strict),不能将全局对象用于默认绑定,this会绑定到undefined。只有函数运行在非严格模式下,默认绑定才能绑定到全局对象。在严格模式下调用函数则不影响默认绑定。

    function foo() { // 运行在严格模式下,this会绑定到undefined
        "use strict";
        console.log( this.a );
    }
    var a = 2;
    // 调用
    foo(); // TypeError: Cannot read property 'a' of undefined
    // --------------------------------------
    function foo() { // 运行
        console.log( this.a );
    }
    var a = 2;
    (function() { // 严格模式下调用函数则不影响默认绑定
        "use strict";
        foo(); // 2
    })();

隐式绑定

当函数引用另一个函数(有上下文对象)的时候,该规则会把this绑定到这个函数(上下文对象)中,并且只有在调用的时候起作用

    function foo() {
        console.log( this.a );
    }
    var obj = {
        a: 2,
        foo: foo//调用了上面的function foo();
    };//这个指的就是有上下文的对象
    obj.foo(); // 2

显示绑定

call,apply,bind 的区别

通过call,apply,bind进行绑定,第一个参数指的是一个对象,而且是将方法(call,apply,bind)this绑定到参数对象的上下文中(个人理解可能有点绕)。

call和apply 的区别是传参列表不同,call是单个参数,apply是数组

bind和call,apply的区别是:call,apply是直接执行函数,而bind是生成一个函数,要执行的话需要去再调用函数执行。bind 和 call 的传参以及this 绑定一样。

显式绑定的方法

call 方法:

    function foo() {
        console.log( this.a );
    }
    var obj = {
        a: 2
    };
    foo.call( obj ); // 2  调用foo时强制把foo的this绑定到obj上

apply 方法:

    function foo(something) {
        console.log( this.a, something );
        return this.a + something;
    }


    function bind(fn, obj) {
        return function() {
            return fn.apply( obj, arguments );
        }
    }
    var obj = {
        a: 2
    };
    
    var bar = bind( foo, obj );
    var b = bar( 3 ); // 2 3
    console.log( b ); // 5

bind 方法:

function foo(something) {
    console.log( this.a, something );
    return this.a + something;
}

var obj = {
    a: 2
};

var bar = foo.bind( obj );

var b = bar( 3 ); // 2 3
console.log( b ); // 5

new 绑定

  1. 构造函数:只是使用了new操作符时被调用的普通函数,不属于也不会实列化一个类
  2. 包括内置函数在内的所有的函数都可以使用new来调用,这就叫做构造函数的调用
  3. 其实构造函数叫做函数的"构造调用"

在使用new来调用函数的时候(构造函数的调用)系统会自动执行下列操作:

  1. 构造一个新对象

  2. 这对象会和被执行的[[prototype]]连接

  3. 这个对象会绑定到函数调用的this

  4. 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象

     function foo(a) {
         this.a = a;
     }
     
     var bar = new foo(2); // bar和foo(..)调用中的this进行绑定
     console.log( bar.a ); // 2
    

绑定的优先级

默认 < 隐式 < 显式 < new