// 多参数
const multiply = (num1, num2) => num1 * num2;
// 可变参数
const sum = (num1, num2, …rest) => {
let result = num1 + num2;
for (let i = 0; i < rest.length; i++) {
result += rest[i];
}
return result;
};
当有多条语句时,需要配上 {...}
和 return
。
另外,如果返回的结果是对象,则需要配上 ()
,像下面这样:
const func = val => ({ value: val });
从上述的写法来看,相较普通函数而言,箭头函数的确简便了很多,提升了我们代码的易用性。但它并非在任何场景下都适用,接下来,将会介绍几种不适合箭头函数的场景,并会提出可行的解决方案。
1、对象的方法
看下面这个例子:
const obj = {
x: 1,
print: () => {
console.log(this === window); // => true
console.log(this.x); // undefined
}
};
obj.print();
this.x 打印出来是 undefined。为什么?然后,我在上面加了一行,发现 this 指向了 window。
解析:print 方法用了箭头函数,其内部的 this 指向的还是上下文 window,上下文中并没有定义 x,所以 this.x 输出为 undefined。
解决办法:用 ES6 的短语法,或者传统的函数表达式都可以。所以,print 要这样写:
print () {
console.log(this === test); // => true
console.log(this.x); // 1
}
2、原型方法
同样的规则也适用于原型方法的定义,使用箭头函数会导致运行时的执行上下文错误。
function Cat (name) {
this.name = name;
}
Cat.prototype.sayCatName = () => {
console.log(this === window); // => true
return this.name;
};
const cat = new Cat(‘Miao’);
cat.sayCatName(); // => undefined
解决办法是:用回传统的函数表达式,像下面这样:
Cat.prototype.sayCatName = function () {
console.log(this === cat); // => true
return this.name;
};
sayCatName 变回传统的函数表达式之后,被调用时的执行上下文就会指向新创建的 cat 实例。
3、事件的回调
看下面这个例子:
const btn = document.getElementById(‘myButton’);
btn.addEventListener(‘click’, () => {
console.log(this === window); // => true
this.innerHTML = ‘Clicked button’;
});
这里会有问题,因为 this 指向了 window。
解析:当为一个 DOM 事件绑定回调函数后,触发回调函数时的 this,需要指向当前发生事件的 DOM 节点,也就是这里的 btn。当回调发生时,浏览器会用 btn 的上下文去调用处理函数。所以最后的 this.innerHTML 等价于 window.innerHTML,问题就在这里。
解决办法:用函数表达式代替箭头函数。像这样:
btn.addEventListener(‘click’, function() {
console.log(this === btn); // => true
this.innerHTML = ‘Clicked button’;
});
另外,在 react 中的事件回调,也经常会遇到类似的问题。
// jsx render
…
// callback
handleClickButton () {
…
}
注意:这里 onClick 的回调函数,并非字符串,而是一个实实在在的函数。可以将 onClick 理解为一个中间变量,所以 react 在处理函数时的 this 指向就会丢失。
为了解决这个问题,我们需要为回调函数绑定 this,使得事件处理函数无论如何传递,this 都指向我们实例化的那个对象。
在这里,如果用箭头函数,可以这样改写:
<Button onClick={ event => this.handleClickButton(event) }>
…
箭头函数并没有自己的 this,所以事件处理函数的调用者并不受影响。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽
**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
[外链图片转存中…(img-u6n80N6X-1713426190885)]
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽