“函数”和“函数执行”的区别

49 阅读4分钟

可理解为:食谱与做菜

  • 函数(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),或者直接用在表达式里。

过程拆解:

  1. 程序遇到 greet("Alice")
  2. 它找到名为 greet 的函数定义。
  3. 将实参 "Alice" 赋值给形参 name。现在函数内部的 name 就等于 "Alice"
  4. 开始执行函数体:计算 "Hello, " + "Alice" + "!",得到字符串 "Hello, Alice!"
  5. return 语句将这个结果返回给调用者。
  6. 这个返回值被赋给了变量 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]