技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

不能使用箭头函数的6种情况

作者:admin    时间:2022-5-10 15:27:50    浏览:

箭头函数的优点很多,相比于常规函数,箭头函数的代码更少更简洁了,并且没有自己的this,这意味着箭头函数不用再需要定义this

 不能使用箭头函数的6种情况
不能使用箭头函数的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.countundefined,因为window对象没有count属性。该next()方法将undefined1,结果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种不应使用箭头函数的情况。通过本文的介绍,你应该知道箭头函数不是任何时候都可以取代常规函数。在编程中我们要选择合适的方法,代码简洁不是编程的唯一需要。

相关文章

标签: 箭头函数  
x
  • 站长推荐
/* 左侧显示文章内容目录 */