和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
绑定和call
、apply
是不允许同时使用的,所以不存在谁的优先级更高
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
的路途还很漫长,每天进步一点点就好啦
💓💓💓再次借用一句电影台词作为结束语吧:
不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更加接受幸福。
——《千与千寻》