ES6 引入箭头函数后,很多开发者喜欢上了它简洁的写法。箭头函数用起来方便,还能避免一些 this 指向问题。但并不是所有地方都适合用箭头函数。有时候用了反而会出错,特别是下面这五种情况。
简单来说,箭头函数和普通函数最大的区别在于 this 的指向:
普通函数的 this 是谁调用就指向谁
箭头函数的 this 是定义时就固定了,不会改变
理解了这一点,你就知道为什么下面这些场景必须用普通函数了。
当我们给对象定义方法时,通常希望方法内部的 this 指向这个对象本身,这样才能访问对象的其他属性。
错误写法(用箭头函数):
const person = {
name: "小明",
introduce: () => {
console.log(`我是${this.name}`); // 这里 this 不是 person
}
};
person.introduce(); // 输出:我是undefined
正确写法(用普通函数):
const person = {
name: "小明",
introduce: function() {
console.log(`我是${this.name}`);
}
};
person.introduce(); // 输出:我是小明
也可以用 ES6 的方法简写:
const person = {
name: "小明",
introduce() {
console.log(`我是${this.name}`);
}
};
给 dom 元素添加事件监听时,我们经常需要操作触发事件的元素本身。普通函数会自动把 this 绑定到当前元素上。
错误写法(用箭头函数):
const button = document.getElementById("myButton");
button.addEventListener("click", () => {
this.classList.add("active"); // 这里 this 不是按钮元素
});
正确写法(用普通函数):
const button = document.getElementById("myButton");
button.addEventListener("click", function() {
this.classList.add("active"); // this 就是被点击的按钮
});
箭头函数不能用作构造函数,尝试用 new 调用会直接报错。
错误写法:
const Person = (name) => {
this.name = name; // 这里会报错
};
const p = new Person("小明"); // 报错:Person is not a constructor
正确写法(用普通函数):
function Person(name) {
this.name = name;
}
const p = new Person("小明");
console.log(p.name); // 输出:小明
也可以用 class 语法:
class Person {
constructor(name) {
this.name = name;
}
}
在原型上定义方法时,也需要让 this 指向实例对象。
错误写法:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = () => {
console.log(this.name); // this 不是实例
};
const p = new Person("小明");
p.sayName(); // 输出:undefined
正确写法:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name); // this 指向实例
};
const p = new Person("小明");
p.sayName(); // 输出:小明
箭头函数没有自己的 arguments 对象,如果需要使用 arguments,必须用普通函数。
错误写法:
const func = () => {
console.log(arguments); // 报错:arguments is not defined
};
func(1, 2, 3);
正确写法:
function func() {
console.log(arguments); // 正常输出参数列表
}
func(1, 2, 3);
不过现在更推荐使用剩余参数语法,箭头函数也能用:
const func = (...args) => {
console.log(args); // 输出:[1, 2, 3]
};
func(1, 2, 3);
箭头函数最适合用在需要保持 this 指向不变的场景,比如回调函数:
const counter = {
count: 0,
start() {
setInterval(() => {
this.count++; // 这里的 this 指向 counter
console.log(this.count);
}, 1000);
}
};
counter.start();
在数组方法中也很方便:
const numbers = [1, 2, 3];
const doubled = numbers.map(n => n * 2);
总结一下:箭头函数很好用,但不能滥用。在需要动态 this 的场景下,还是得用普通函数。掌握两者的区别,才能写出更可靠的代码。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
我理解的 JavaScript 函数式编程,都认为属于函数式编程的范畴,只要他们是以函数作为主要载体的。
给你的代码增加一点点函数式编程的特性,最近我对函数式编程非常感兴趣。这个概念让我着迷:应用数学来增强抽象性和强制纯粹性,以避免副作用,并实现代码的良好可复用性。同时,函数式编程非常复杂。
Async/await以及它底层promises的应用正在猛烈地冲击着JS的世界。在大多数客户端和JS服务端平台的支持下,回调编程已经成为过去的事情。当然,基于回调的编程很丑陋的。
如果你曾经了解或编写过JavaScript,你可能已经注意到定义函数的方法有两种。即便是对编程语言有更多经验的人也很难理解这些差异。在这篇博客的第一部分,我们将深入探讨函数声明和函数表达式之间的差异。
随着软件应用的复杂度不断上升,为了确保应用稳定且易拓展,代码质量就变的越来越重要。不幸的是,包括我在内的几乎每个开发者在职业生涯中都会面对质量很差的代码。这些代码通常有以下特征:
在js开发中,程序代码是从上而下一条线执行的,但有时候我们需要等待一个操作结束后,再进行下一步操作,这个时候就需要用到回调函数。 在js中,函数也是对象,确切地说:函数是用Function()构造函数创建的Function对象。
这篇文章主要介绍ES5中函数的4种调用,在ES5中函数内容的this指向和调用方法有关。以及ES6中函数的调用,使用箭头函数,其中箭头函数的this是和定义时有关和调用无关。
函数的三种定义方法分别是:函数定义语句、函数直接量表达式和Function()构造函数的方法,下面依次介绍这几种方法具体怎么实现,在实际编程中,Function()构造函数很少用到,前两中定义方法使用比较普遍。
微软 称excel就实现面向开发者的功能,也就是说我们不仅可以全新定义的公式,还可以重新定义excel的内置函数,现在Excel自定义函数增加了使用 JavaScript 编写的支持,下面就简单介绍下如何使用js来编写excel自定义函数。
这篇文章主要讲解:js立即执行函数是什么?js使用立即执行函数有什么作用呢?js立即执行函数的写法有哪些?
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!