js -> this

2022-03-16  本文已影响0人  只会ctrl_c_v

优先级: new绑定 > 显式绑定 > 隐式绑定 > 默认绑定

1、 默认绑定
    console.log('this', this); //输出 Window
    function sayHello() {
        // this指向全局对象(非严格模式下)
        console.log("line 16 ~ sayHello ~ sayHello",this, this.name, name)
    }
    sayHello() //输出 Window、Tom、Tom
    var name = 'Tom'
2、 隐式绑定(格式: xxx.fn() || a.b.c.xxx.fn() 那么,this指向xxx)
    function sayHello() {
        console.log("line 16 ~ sayHello ~ sayHello",this, this.name, name)
    }
    var name = 'Tom'
    var Person0 = {
        name: 'Jack',
        sayHello: sayHello
    }
    Person0.sayHello() //输出 Person0、Jack、Tom
    var Person1 = {
        name: 'Sam',
        sayHello: sayHello,
        friend: Person0
    }
    // 不管有多少层,在判断this的时候,我们只关注最后一层,所以绑定的为 Person0
    Person1.friend.sayHello() //输出 Person0、Jack、Tom
    Person1.sayHello() //输出 Person1、Sam、Tom
    // 需注意:这种就不是隐式绑定(`隐式绑定的丢失`)
    var say = Person1.sayHello;
    say() //输出 Window、Tom、Tom

    var Person2 = {
        name: 'Mike',
        sayHello: function(){
            setTimeout(function(){
                // setTimeout的回调函数中,this使用的是默认绑定,为全局对象
                console.log("line 43 ~ setTimeout ~ sayHello",this, this.name, name)
            })
        }
    }
    var Person3 = {
        name: 'Bill',
        sayHello: sayHello
    }
    Person2.sayHello(); //输出 Window、Tom、Tom
    // 下面👇🏻的区别:setTimeout(fn,delay)相当于是将Person3.sayHello赋值给了一个变量fn,最后执行了变量,`隐式绑定的丢失`。
    setTimeout(Person3.sayHello,100); //输出 Window、Tom、Tom
    setTimeout(function(){
        Person3.sayHello(); //输出 Person3、Bill、Tom
    },200);
3、 显式绑定(通过call,apply,bind的方式,显式的指定this所指向的对象)
     function sayHello() {
        console.log("line 16 ~ sayHello ~ sayHello",this, this.name, name)
    }
    var name = 'Tom'
    var Person0 = {
        name: 'Jack',
        sayHello: sayHello
    }
    var Person1 = {
        name: 'Sam',
        sayHello: sayHello,
        friend: Person0
    }
  // 如果我们将null或者是undefined作为this的绑定对象传入call、apply或者是bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。
    var sayH = Person0.sayHello;
    sayH() //输出 Window、Tom、Tom
    // 强硬绑定到 Persion1、Persion3
    sayH.call(Person0) //输出 Person0、Jack、Tom
    sayH.call(Person1) //输出 Person1、Sam、Tom
    sayH.call(null) //输出 Window、Tom、Tom
    var sayHi = function(fn) {
        fn()
    }
    // call(Person1, Person1.sayHello)相当于Person1.sayHello已经被赋值给fn了,隐式绑定也就丢了
    sayHi.call(Person1, Person1.sayHello);//输出 Window、Tom、Tom
3、 new绑定
    function newSayHi(name){
       this.name = name;
    }
    var newSay = new newSayHi('Hello ~ Hi') 
    console.log("line 80 ~ newSayHi ~ newSay",this, newSay, newSay.name) //输出 Window、newSayHi、Hello ~ Hi
上一篇下一篇

猜你喜欢

热点阅读