美文网首页前端js css html
JavaScript this的指向和改变this指向的方法

JavaScript this的指向和改变this指向的方法

作者: 暴躁程序员 | 来源:发表于2022-06-14 19:45 被阅读0次

1. this 的指向

  1. 单独使用,this 指向全局对象
    在 浏览器 环境下指向 window 对象
    在 nodejs 环境下指向 {} 对象
console.log(this); // 全局对象
  1. 在函数中,this 指向
    在严格模式下,this指向的是 undefined
"use strict";
function show() {
  console.log(this); // undefined
}
show();

在非严格模式下,this指向的是 全局对象
在 浏览器 环境下指向 window 对象

function show() {
  console.log(this); // 浏览器下 window 对象,nodejs 环境下 nodejs 全局对象
}
show();
  1. 在构造函数中,this 指向 这个构造函数创建的实例对象
    this 指向的目标只能是对象,即:实例化后的对象
function A() {
    this.name = "AAAAAAA";
    this.age = 18;
}
console.log(new A()); // A {name: 'AAAAAAA', age: 18} 
  1. 在对象的方法中,this 指向该方法所属的对象
const obj = {
  name: "obj",
  show() {
    console.log(this); // obj 对象本身
  },
};
obj.show();
  1. 在事件中,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

  1. call、apply、bind 三者都可改变this的指向
  2. call和bind方法传参方式一样,第一个参数是this指向的对象,其他是方法参数,以逗号隔开,区别是 bind 方法不立即执行,需要以方法的方式调用
  3. apply方法,第一个参数是this指向的对象,其他是方法参数,放在数组中以逗号隔开
  1. 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
  1. 在构造函数继承中,使用 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}

相关文章

网友评论

    本文标题:JavaScript this的指向和改变this指向的方法

    本文链接:https://www.haomeiwen.com/subject/qkozmrtx.html