不能使用箭头函数的6种情况
作者:admin 时间:2022-5-10 15:27:50 浏览:箭头函数的优点很多,相比于常规函数,箭头函数的代码更少更简洁了,并且没有自己的this
,这意味着箭头函数不用再需要定义this
。
不能使用箭头函数的6种情况
但是箭头函数不是在所有情况下都能取代常规函数。
这里有一些你不应该看箭头函数的情况。
1、对象方法
var cat = {
lives: 9,
jumps: () => {
this.lives--;
}
}
当你调用cat.jumps
时,lives
的数量不会减少。这是因为this
没有绑定到任何东西,并且会从其父作用域继承this
的值。
我们再看下面一个示例。
const counter = {
count: 0,
next: () => ++this.count,
current: () => this.count
};
该counter
对象有两种方法:current()
和next()
。该current()
方法返回当前计数器值,该next()
方法返回下一个计数器值。
下面显示了下一个计数器值,它应该是 1:
console.log(counter.next());
但是,它返回NaN
。
原因是当你在对象内部使用箭头函数时,它会this
从封闭的词法范围继承值,即本例中的全局范围。
this.count
里面的方法next()
等价于window.count
(在网络浏览器中)。
默认情况下window.count
是undefined
,因为window
对象没有count
属性。该next()
方法将undefined
加1,结果NaN
。
要解决此问题,可以使用常规函数作为对象字面量的方法,如下所示:
const counter = {
count: 0,
next() {
return ++this.count;
},
current() {
return this.count;
}
};
现在,调用该next()
方法将按预期返回一个:
console.log(counter.next()); // 1
2、具有动态上下文的回调函数
看看下面的这个事件处理程序:
var button = document.getElementById('press');
button.addEventListener('click', () => {
this.classList.toggle('on');
});
如果我们点击按钮,我们会得到一个 TypeError
。这是因为this
未绑定到按钮,而是绑定到其父范围。
3、原型方法
以下Counter
使用prototype
模式的对象:
function Counter() {
this.count = 0;
}
Counter.prototype.next = () => {
return this.count;
};
Counter.prototype.current = () => {
return ++this.next;
}
这些next()
和current()
方法中的this
值引用全局对象。由于你希望方法中的this
值引用Counter
对象,因此你需要使用常规函数:
function Counter() {
this.count = 0;
}
Counter.prototype.next = function () {
return this.count;
};
Counter.prototype.current = function () {
return ++this.next;
}
4、事件处理程序
假设你有以下输入文本字段:
<input type="text" name="username" id="username" placeholder="Enter a username">
并且你希望在用户输入用户名时显示问候消息。下面<div>
显示了将显示问候消息的元素:
<div id="greeting"></div>
一旦用户输入他们的用户名,你就可以捕获输入的当前值并将其更新为<div>
元素:
const greeting = document.querySelector('#greeting');
const username = document.querySelector('#username');
username.addEventListener('keyup', () => {
greeting.textContent = 'Hello ' + this.value;
});
但是,当你执行代码时,无论你键入什么内容,你都会收到以下消息:
Hello undefined
这意味着this.value
事件处理程序中的 总是返回undefined
。
箭头函数没有自己的this
值。它使用this
封闭词法范围的值。在上面的例子中,this
在箭头函数里引用了全局对象。
在 Web 浏览器中,全局对象是window
,该window
对象没有value
属性。因此,JavaScript 引擎将 value
属性添加到window
对象并将其值设置为undefined
.
要解决此问题,你需要改用常规函数,将this
值绑定到<input>
触发事件的元素。
username.addEventListener('keyup', function () {
input.textContent = 'Hello ' + this.value;
});
5、承诺和承诺链
箭头函数使代码更清晰、更直观的另一个地方是管理异步代码。
Promise
使管理异步代码变得容易得多。但是,虽然使用 Promise
,仍然需要定义在异步代码或调用完成后运行的函数。
这是箭头函数的理想位置,特别是如果你的结果函数是有状态的,引用对象中的某些内容。
缺点是确保你再次了解this
如何工作。例子:
this.doSomethingAsync().then((result) => { this.storeResult(result); });
6、当它使你的代码不那么可读时
通过常规函数,人们知道会发生什么。使用箭头函数,可能很难立即解读你正在查看的内容。
总结
本文介绍了6种不应使用箭头函数的情况。通过本文的介绍,你应该知道箭头函数不是任何时候都可以取代常规函数。在编程中我们要选择合适的方法,代码简洁不是编程的唯一需要。
相关文章
标签: 箭头函数
- 站长推荐