【译】函数声明 VS 函数表达式
栏目: JavaScript · 发布时间: 6年前
内容简介:可能你已经知道有好几种方式来编写一个函数。我们整天都会编写诸如注意:所有例子都使用 javascript 来编写。当你创建一个具名函数,这就是
可能你已经知道有好几种方式来编写一个函数。我们整天都会编写诸如 function doStuff() {}
() => {}
这样的代码。但是你知道它们之间的差异或者为什么使用特定的方式来编写函数吗?
注意:所有例子都使用 javascript 来编写。
差异一:name
当你创建一个具名函数,这就是 函数声明 。 函数表达式 可以省略 name,使之成为匿名函数。
函数声明
function doStuff() {}
复制代码
函数表达式
const doStuff = function() {};
复制代码
或者 ES6 中新增的箭头函数:
const doStuff = () => {};
复制代码
提升
提升表示你的函数和变量可以在作用域一开始的部分就能被使用,而不是仅在它们被创建之后。它们在编译时初始化,在文件中的任何位置使用。
译者:结合下面的代码可以更好的理解提升的概念。
foo(); // hello
function foo() {
console.log('hello');
}
console.log(num); // undefined
var num = 1;
console.log(num); // 1
复制代码
函数声明存在提升而函数表达式不会。
举例更容易说明问题:
doStuff();
function doStuff() {}
复制代码
上面的代码能正常运行,但下面的代码不会:
doStuff();
const doStuff = () => {};
复制代码
使用函数表达式的情况
看起来好像因为函数声明的提升特性,让函数表达式变得没有什么用处了。但是需要考虑 函数会在何时何地被使用 才能决定使用声明或者表达式。
函数表达式可以有效的 避免污染全局作用域 。比起你的代码中充斥着各种各样的具名函数,匿名函数可以让你使用后立即丢弃掉。
IIFE
立即执行的函数表达式。从名字就可以知道它的作用了。函数同时被创建和调用,你可以这样使用 IIFE:
(function() => {})();
复制代码
或者
(() => {})();
复制代码
如果想深入了解,可以查看这篇文章。
回调函数
作为参数传入其他函数的函数通常被称为回调函数。例子:
function mapAction(item) {
// do stuff to an item
}
array.map(mapAction);
复制代码
这里的问题是 mapAction
会在你整个程序中都可用——但这没有必要。如果是一个函数表达式,它在使用它的函数之外就不可用了。
array.map(item => { //do stuff to an item })
复制代码
或者
const mapAction = function(item) {
// do stuff to an item
};
array.map(mapAction);
复制代码
当然这里的 mapAction
在初始化它的代码之后仍然可用。
以上所述就是小编给大家介绍的《【译】函数声明 VS 函数表达式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 函数声明?函数表达式?我该怎么选?!
- JavaScript(js)函数声明与函数表达式的区别
- 深入理解 lambda表达式 与 函数式编程 函数式接口源码解析(二)
- ECMAScript学习笔记(八)——函数表达式
- 函数式编程1-Lambda表达式
- Java 函数式编程(二)Lambda表达式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员代码面试指南:IT名企算法与数据结构题目最优解
左程云 / 电子工业出版社 / 2015-9 / 79.00元
这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解》 这本书的介绍吧!