1. this 的指向
- 单独使用,this 指向全局对象
在 浏览器 环境下指向 window 对象
在 nodejs 环境下指向 {} 对象
console.log(this); // 全局对象
- 在函数中,this 指向
在严格模式下,this指向的是 undefined
"use strict";
function show() {
console.log(this); // undefined
}
show();
在非严格模式下,this指向的是 全局对象
在 浏览器 环境下指向 window 对象
function show() {
console.log(this); // 浏览器下 window 对象,nodejs 环境下 nodejs 全局对象
}
show();
- 在构造函数中,this 指向 这个构造函数创建的实例对象
this 指向的目标只能是对象,即:实例化后的对象
function A() {
this.name = "AAAAAAA";
this.age = 18;
}
console.log(new A()); // A {name: 'AAAAAAA', age: 18}
- 在对象的方法中,this 指向该方法所属的对象
const obj = {
name: "obj",
show() {
console.log(this); // obj 对象本身
},
};
obj.show();
- 在事件中,this 指向当前事件所在的 dom 元素
<div onclick="show(this)">hello world</div>
<script>
function show(params) {
console.log(params); // 当前dom元素 <div onclick="show(this)">hello world</div>
}
</script>
2. 改变 this 指向的三个方法 call、apply、bind
- call、apply、bind 三者都可改变this的指向
- call和bind方法传参方式一样,第一个参数是this指向的对象,其他是方法参数,以逗号隔开,区别是 bind 方法不立即执行,需要以方法的方式调用
- apply方法,第一个参数是this指向的对象,其他是方法参数,放在数组中以逗号隔开
- call、apply、bind 方法使用示例
// 让 A 的 this 指向 B
function A(p1, p2) {
// this.name = 'A' // 注意:加上此步结果是 { name: 'A' }
console.log(this, p1, p2);
}
var B = { name: "B" };
A.call(B, "x", "xx"); // 结果: { name: 'B' } x xx
A.apply(B, ["x", "xx"]); // 结果: { name: 'B' } x xx
A.bind(B, "x", "xx")(); // 结果: { name: 'B' } x xx
- 在构造函数继承中,使用 call、apply,让子类继承父类的属性
// 父类
function A() {
this.name = "AAAAAAA";
this.age = 18;
}
// 子类
function B() {
this.name = "B";
A.call(this)
// this.name = "B"; // 写在下面,结果是 {name: 'B', age: 18},后执行会覆盖先执行
}
console.log(new (B)); // {name: 'AAAAAAA', age: 18}
网友评论