可理解为:食谱与做菜
-
函数(Function):就像一份食谱。
- 它详细列出了做一道菜需要的原料(在函数中叫 参数)和步骤(在函数中叫 函数体)。
- 它本身只是一个描述,一份计划。写在纸上的食谱不会让你吃饱。
-
函数执行(Function Execution / Invocation):就像你真正动手,按照食谱做菜的过程。
- 你需要准备好实际的食材(传入 实参)。
- 你按照步骤生火、翻炒、调味。
- 最终你得到了一个结果:一盘可以吃的菜(在函数中叫 返回值)。
1. 函数(Function)—— 定义和能力
函数是一段可重复使用的代码块,被设计用来执行一个特定的任务。
关键点:
- 它是静态的:它只是一段存储在内存中的代码,等待被使用。
- 它需要被定义:你需要先写好这个函数,告诉计算机它叫什么,需要什么参数,要做什么事。
- 它自己不运行:仅仅定义函数,函数里的代码是不会执行的。
函数的组成部分(以JavaScript为例):
// 这是函数的【定义】
function greet(name) { // ‘function’是关键字,‘greet’是函数名,‘name’是【形参】
return "Hello, " + name + "!"; // 大括号 {} 内部是【函数体】,return语句指定【返回值】
}
- 函数名 (
greet):如何称呼这个函数。 - 形参 (
name):一个占位符,代表函数需要一个什么样的输入。它是在函数定义时写的。 - 函数体 (
{ ... }):包含具体要执行的语句。 - 返回值 (
return ...):函数执行后可以返回一个结果。
在这一点上,计算机只是知道了有一个叫 greet 的“食谱”存在,但还没有做任何菜。
2. 函数执行(Function Execution / Invocation)—— 行动和结果
函数执行,也叫调用函数,是指我们主动命令计算机去运行函数体中的代码。
关键点:
- 它是动态的:它是一个动作,一个过程。
- 它需要明确的指令:通过使用函数名后跟一对圆括号
()来触发。 - 它会产生效果:函数体内的代码会被逐行执行,可能会计算一个结果、修改数据、或者在屏幕上输出内容。
函数执行的组成部分:
// 这是函数的【执行】或【调用】
let message = greet("Alice"); // “Alice”是传入的【实参】
console.log(message); // 输出:Hello, Alice!
- 调用操作符
():这是触发执行的“开关”。没有它,函数就不会运行。 - 实参 (
"Alice"):在调用时实际传入的具体值。这个值会替换掉函数定义中的形参 (name)。 - 返回值处理:函数执行后返回的值 (
"Hello, Alice!") 可以被赋给一个变量(如message),或者直接用在表达式里。
过程拆解:
- 程序遇到
greet("Alice")。 - 它找到名为
greet的函数定义。 - 将实参
"Alice"赋值给形参name。现在函数内部的name就等于"Alice"。 - 开始执行函数体:计算
"Hello, " + "Alice" + "!",得到字符串"Hello, Alice!"。 return语句将这个结果返回给调用者。- 这个返回值被赋给了变量
message。
总结与对比表格
| 特性 | 函数(定义) | 函数执行(调用) |
|---|---|---|
| 本质 | 一个代码块,一个计划 | 一个动作,一个过程 |
| 状态 | 静态的、被动的 | 动态的、主动的 |
| 目的 | 描述“做什么”和“怎么做” | 真正地“做”这件事,并得到结果 |
| 语法(JS) | function functionName(parameters) { ... } | functionName(arguments) |
| 关键符号 | 大括号 {} | 圆括号 () |
| 参数 | 形参,是占位符 | 实参,是具体的值 |
| 结果 | 定义本身不产生直接结果 | 会执行代码并可能返回一个结果 |
一个常见的混淆点
看看下面这段代码,你能指出问题吗?
// 正确的方式
let result1 = greet("Bob"); // 执行函数,并将返回值赋给 result1
console.log(result1); // 输出:Hello, Bob!
// 错误的理解
let result2 = greet; // 注意:没有括号!
console.log(result2); // 输出:[Function: greet]
let result2 = greet;:这里没有使用括号,所以这不是函数执行。这行代码的意思是:“把函数greet本身这个对象,赋值给变量result2”。所以result2现在也指向了那个“食谱”,而不是菜。当你打印它时,自然显示的是[Function: greet]。