关于this变量有4种绑定规则,分别是默认绑定,隐式绑定,显示绑定和new 绑定,权重由低到高。还有个特殊的箭头函数里的this,与箭头函数定义时的外层作用域有关。
一、默认绑定
默认绑定,函数直接调用,this的值为window对象,严格模式下,函数内部的this为undefined,而全局的this仍为window。
例子:
function foo() {
console.log(this.a)
}
foo() // undefined
二、隐式绑定
1.函数的调用是在某个对象上触发的,即调用位置上存在上下文对象。
例子:
function foo() {
console.log(this.a)
}
const obj = {
a: 1,
foo
}
obj.foo() // 1
2.多层调用链this由最近的调用对象决定
例子:
function foo() {
console.log(this.a)
}
const obj = {
a: 1,
foo
}
const obj1 = {
a: 2,
obj
}
obj1.obj.foo() // 1
3.隐式丢失
3.1(函数别名)
将函数赋值到另一个变量名上,再进行调用。仅仅是赋值,而没有进行函数的调用。
例子:
function foo() {
console.log(this.a)
}
const obj = {
a: 1,
foo
}
const foo1 = obj.foo
foo1() // undefined
3.2(被隐式绑定的函数作为参数传入)
仅仅是传递函数本身,而没有进行调用
例子:
function foo() {
console.log(this.a)
}
const obj = {
a: 1,
foo
}
setTimeOut(obj.foo, 1000) // undefined
三、显示绑定
直接调用call、apply、bind函数更改this指向,如果传入的为空,null,undefined,则显示绑定无效,使用默认绑定规则。
call() 第一个参数为this的指向对象,其余参数依次传入
apply() 第一个参数为this的指向对象,其余参数用数组包裹传入
bind() 传入参数与call一致,但是bind返回的是一个新函数,需要调用
其余还有forEach,map,filter等函数也可以更改this值。
四、new 绑定
如果函数没有return对象,则会返回新对象
五、箭头函数
箭头函数内部没有this的绑定,访问的this为定义箭头函数时,外层作用域的this,注意,是作用域,而与外层函数调用对象无关,不要混淆。
箭头函数无法直接调用call,apply,bind等函数进行显示绑定this,但是可以通过改变外层作用域的this间接更改。
参考文献:
彻底搞懂 JS 中 this 机制
this - JavaScript | MDN
练习题:
这 7 道关于 this 的面试题,你能答对几个?
【建议👍】再来40道this面试题酸爽继续(1.2w字用手整理) - 掘金
若有收获,就点个赞吧
所有评论(1)
引用原文:【建议👍】再来40道this面试题酸爽继续(1.2w字用手整理) - 掘金
题目6.2很有意思,window.name默认值为'',当设置window.name后,直到关闭该tab页设置的值才会消失,即使刷新页面也不会消失。