fail: () => { console.log("Bad session!"); // 登录态过期 this.login() } 情分析 this 的作用域
时间: 2024-03-02 10:48:16 浏览: 136
session失效
在这个例子中,箭头函数 `() => { console.log("Bad session!"); this.login() }` 中的 `this` 实际上指向的是函数定义时所在的作用域,即定义时的 `this`,而不是函数调用时的 `this`。在这里,函数定义时所在的作用域是全局作用域,所以 `this` 指向的是全局对象。
因此,如果在这个箭头函数中想要使用对象的实例方法,需要注意作用域问题。一种解决方式是使用普通函数,因为普通函数内的 `this` 指向的是调用时的对象实例。
另一种解决方式是在定义对象时,使用箭头函数或者使用 `bind` 方法来固定函数内部的 `this` 指向,例如:
```javascript
const obj = {
login() {
console.log('login');
},
fail: () => {
console.log("Bad session!");
// 登录态过期
this.login(); // 这里的 this 指向的是全局对象,所以无法调用 obj 的 login 方法
},
success() {
console.log("Successful operation!");
}
};
obj.fail(); // Bad session! TypeError: this.login is not a function
```
上面的代码中,`fail` 方法中的箭头函数中的 `this` 指向的是全局作用域中的 `this`,所以无法调用 `obj` 对象的 `login` 方法。可以使用普通函数或者使用 `bind` 方法来解决这个问题:
```javascript
const obj = {
login() {
console.log('login');
},
fail() {
console.log("Bad session!");
// 登录态过期
this.login(); // this 指向 obj 对象
},
success() {
console.log("Successful operation!");
}
};
obj.fail(); // Bad session! login
```
或者使用 `bind`:
```javascript
const obj = {
login() {
console.log('login');
},
fail: function() {
console.log("Bad session!");
// 登录态过期
this.login(); // this 指向 obj 对象
}.bind(this),
success() {
console.log("Successful operation!");
}
};
obj.fail(); // Bad session! login
```
在这里,`bind` 方法可以将函数内部的 `this` 指向 `obj` 对象。这样,就可以在箭头函数中调用 `obj` 对象的实例方法了。
阅读全文