函数

假设你在为购物车中的商品定价。你拿一个数字,加上税,四舍五入,然后用货币符号格式化。然后你需要为下一件商品重复操作,再下一件。到处复制这四个步骤是 bug 的温床:在一个地方修复四舍五入,还有三个复本仍然是错的。函数让你为这个步骤块命名一次,然后在需要时随时运行它。本章讲述的是如何编写这些块、向它们传入输入,以及获取返回值。
声明和调用函数
一个**函数**是一个命名的代码块,你可以随时运行。你只写一次步骤,给它们一个名字,然后可以根据这个名字多次运行它。
你可以用 function 关键字创建一个函数:
function greet() {
console.log("Hi there");
}这是完整的定义,但还没有执行任何操作。编写函数存储这些步骤;它不运行它们。要实际运行它,你需要通过在它的名字后面加上括号来调用它:
greet(); // Hi there
greet(); // Hi there两行,两个问候,来自一个代码块。定义和调用是分开的事情,混淆它们是初学者首先遇到的问题。
给函数一个清晰的、动词式的名字,说明它做什么(greet、logDivider),就像你在命名变量时采取的那样。一个在十个地方调用的函数的可读性只有其名字那么好。
greet() 一样。这个分割一开始让我困惑:定义是配方,调用是真正做饭。你可以随时调用同一个函数多次。 参数和返回值
当你可以向函数传入一些东西时,函数更有用。你传入的值是**参数**:列在括号中的名字,代表你调用它时传入的任何东西。
function greet(name) {
console.log("Hi " + name);
}
greet("张三"); // Hi 张三
greet("李四"); // Hi 李四name 是参数。当你调用 greet("张三") 时,文本 "张三" 为该次运行插入到 name 中。一个函数,不同的结果,取决于你给它什么。
到目前为止,这些函数打印一些东西。通常你想要一个函数将值交回,以便你以后可以使用它。那是 return 做的:
function double(number) {
return number * 2;
}
const result = double(5);
console.log(result); // 10return 将值从函数发送出去。double(5) 变成 10,你可以存储它、打印它或继续传递它。打印在屏幕上显示值;返回将其交回到你的代码以继续使用。
return 将值交回,以便你的代码以后可以使用它。用 console.log 打印在屏幕上显示它;返回将其交回给你。我花了一阵子才感受到这个差异。 箭头函数
有一个更短的方式来写函数,叫做**箭头函数**。你把它存储在一个变量中,用 => 箭头而不是 function 关键字:
const add = (a, b) => {
return a + b;
};
console.log(add(2, 3)); // 5当函数是像这样的单个表达式时,你可以删除大括号和 return,让箭头为你交回值:
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5两个做同样的事情。你会在现代 JavaScript 中到处看到箭头函数,所以认识形状会有帮助:一个名字,一个 =,输入,一个箭头,和函数体。
=> 而不是 function 关键字。当函数体是一个表达式时,你可以删除大括号和 return,箭头为你交回值。你会不断看到这个形状,所以快速适应阅读它是值得的。 函数从这里去往何处
函数是你停止重复自己的方式:命名一个步骤块,向它传入输入,得到值回。一旦这点成立,你写的大部分代码变成小函数调用其他函数,每个做一个清晰的工作。
从这里,函数到处显示。你会将它们传递给数组方法来转换数据列表,用它们来组织来自条件语句的分支逻辑,并依靠你从变量开始的命名规范。下一次你发现自己复制一个代码块时,那是将它包装在函数中的信号。

