和this的第二次邂逅(下篇)

55 阅读2分钟

和this的第二次邂逅(下篇)

上篇我们学习了this的四个绑定规则,本篇我们继续学习this的其它知识:

1.规则优先级

🏀默认规则的优先级最低

  • 毫无疑问,默认规则的优先级是最低的,因为存在其他规则时,就会通过其他规则的方式绑定this

🏀显示绑定的优先级高于隐式绑定

  • 代码测试:
function foo() {
    console.log(this);
}
​
var obj = {
    name: "obj",
    foo: foo.bind("ddd")
}
​
obj.foo() //String {'ddd'}

🏀new绑定优先级高于隐式绑定

  • 代码测试:
var obj = {
    name: "obj",
    foo: function () {
        console.log(this);
    }
}
​
var f = new obj.foo() // {}

🏀new绑定优先级高于bind

  • new绑定和callapply是不允许同时使用的,所以不存在谁的优先级更高
  • new绑定可以和bind一起使用、new绑定优先级更高
  • 代码测试:
function foo() {
    console.log(this);
}
​
var bar = foo.bind("sss"); //{}
new bar() 

📌📌📌总结:默认绑定<隐式绑定<显示绑定<new绑定

2.规则之外

上述四个规则足以应付平时的开发,但特殊总是存在的

🍩忽略显示绑定:如果在显示绑定中,我们传入一个null或者undefined,那么这个显示绑定会被忽略,使用默认规则:

  • 代码测试:
function foo() {
    console.log(this);
}
​
//call、apply、bind当传入null、undefined十,自动将this绑定为全局对象
foo.call(null) //window
foo.apply(undefined) //window
var bar = foo.bind(null)
bar() //window

🍩间接函数引用:创建一个函数的间接引用,这种情况使用默认绑定规则。

  • 赋值(obj2.foo = obj1.foo)的结果是foo函数
  • foo函数被直接调用,那么是默认绑定
  • 代码测试:
var obj1 = {
    name: "obj1",
    foo: function () {
        console.log(this);
    }
}
​
var obj2 = {
    name: "obj2"
};
​
//独立函数调用
(obj2.bar = obj1.foo)() //window

🍩ES6箭头函数

  • 箭头函数没有this,根据外层作用域来决定this
  • 代码测试:
var obj = {
    name: "obj",
    foo() {
        //实际上是上层作用域中foo函数中this
        let arrow = () => console.log(this.name);
        arrow();
    }
};
​
obj.foo(); // obj

3.总结

💓💓💓关于this的全部知识就分享到这里,本来还想着再上几道面试题,但是又发现没必要哈,上面的全部理解掌握,面试题我们都可以说just so so

💓💓💓js真的是一门神奇美妙的语言,学会它可能只需要几天,但是掌握它需要几年,学习js的路途还很漫长,每天进步一点点就好啦

💓💓💓再次借用一句电影台词作为结束语吧:

不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更加接受幸福。

——《千与千寻》