this指向问题

目录

1.普通函数调用,此时 this 指向 window

2.构造函数调用, 此时 this 指向 实例对象

3.对象方法调用, 此时 this 指向 该方法所属的对象

4.dom事件调用this指向绑定的dom

5.定时器函数, 此时 this 指向 window

           6 箭头函数


1.普通函数调用,此时 this 指向 window

    function fn() {
       console.log(this);   // window
     }
     fn();  //  window.fn(),此处默认省略window

2.构造函数调用, 此时 this 指向 实例对象

 function Person(age, name) {
         this.age = age;
         this.name = name
         console.log(this)  // 此处 this 分别指向 Person 的实例对象 p1 p2
     }
    var p1 = new Person(15, 'lang')
    var p2 = new Person(20, 'ge')



构造函数中的this指向创建出来的实例


//不使用new指向window
function Person(name) {
  console.log(this) // window
  this.name = name;
}
Person('inwe')
//使用new
function Person(name) {
  this.name = name
  console.log(this) //people
  self = this
}
var people = new Person('iwen')
console.log(self === people) //true
//这里new改变了this指向,将this由window指向Person的实例对象people

3.对象方法调用, 此时 this 指向 该方法所属的对象

 var obj = {
       fn () {
         console.log(this); // obj
       }
     }
    obj.fn();//对象调用里面的方法

4.dom事件调用this指向绑定的dom


<body>
    <button id="btn">默认按钮</button>
</body>
<script>
    var oBtn = document.getElementById("btn");
    oBtn.onclick = function() {
        console.log(this); // dom事件调用this指向绑定的dom  //<button id="btn">默认按钮</button>
    }
</script>

5.定时器函数, 此时 this 指向 window

 setInterval(function () {
       console.log(this); // window
     }, 1000);

6 箭头函数

当使用箭头函数时,`this`关键字将指向最近的外层非箭头函数的上下文。如果没有找到外层的非箭头函数,则`this`将指向全局对象。

例如,以下代码中,当调用`person.sayHello()`方法时,箭头函数`() => console.log(this.name)`中的`this`关键字将指向`person`对象,因为它是最近的外层非箭头函数的上下文:

const person = {
  name: 'Alice',
  sayHello: function() {
    const innerFunc = () => console.log(this.name);
    innerFunc();
  }
};
person.sayHello(); // 输出 "Alice"

另一方面,在以下代码中,当调用`sayHello()`全局函数时,箭头函数`() => console.log(this)`中的`this`关键字将指向全局对象,因为没有找到外层的非箭头函数:

const sayHello = () => console.log(this);
sayHello(); // 输出全局对象

需要注意的是,当使用普通函数时,`this`关键字将根据函数的调用方式而有所不同。例如,当使用`call()`或`apply()`方法调用函数时,可以显式地设置`this`关键字的值。

总结:

在JavaScript中,`this`关键字的值取决于函数的调用方式。当使用普通函数时,`this`关键字的值取决于函数的调用方式。如果函数是作为对象的方法调用,则`this`关键字将指向该对象;如果函数是作为普通函数调用,则`this`关键字将指向全局对象(在浏览器中是`window`对象,在Node.js中是`global`对象)。

例如,在以下代码中,调用`person.sayHello()`方法时,`this`关键字将指向`person`对象:

const person = {
  name: 'Alice',
  sayHello: function() {
    console.log(this.name);
  }
};
person.sayHello(); // 输出 "Alice"

而在以下代码中,`sayHello()`函数是作为普通函数调用,因此`this`关键字将指向全局对象:

function sayHello() {
  console.log(this);
}
sayHello(); // 输出全局对象

需要注意的是,可以使用`call()`或`apply()`方法显式地设置函数的`this`关键字的值。例如,在以下代码中,通过调用`sayHello.call(person)`方法,将`this`关键字的值设置为`person`对象,使得`console.log(this.name)`输出`person`对象的`name`属性:

const person = {
  name: 'Alice'
};
function sayHello() {
  console.log(this.name);
}
sayHello.call(person); // 输出 "Alice"

另外,当使用`new`关键字创建函数的实例时,`this`关键字将指向该实例。

总结完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙雨溪 彩色之外

你的打赏是我创作的氮气加速动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值