摘录
通过其名称调用函数将触发运行时查找定义、传递参数、执行函数体代码,并将任何返回值返回到调用站点。
函数是许多编程语言中的基本构建块。它们代表可以根据需要执行的命名代码块。但是当代码中通过其名称调用函数时,究竟发生了什么?在本篇文章中,我们将揭示函数调用的神秘之处。
介绍
在编程中,函数是一段可重复使用的代码段,可以通过名称“调用”来执行特定的任务。函数通常通过参数接受输入数据,用该数据执行代码,并返回一个输出值。
通过名称调用函数是我们调用其预定义的代码运行的方式。理解函数执行时发生的情况对于编写和有效使用函数至关重要。
调用函数时发生了什么?
当在代码中通过名称调用函数时,触发了一系列事件:
步骤1:识别函数
JavaScript运行时查找调用中引用的函数名称,并指向函数定义。
例如:
1function calculateTotal(items) {
2 //...
3}
调用calculateTotal()
会定位到此定义的函数。
我们还可以演示转换:
1// Snake case to camelCase
2stringToCamelCase('calculate_total') -> calculateTotal
步骤2:传递参数
调用中提供的任何参数值将传递到函数的参数中。
1// Function definition
2function greet(name) {
3 // ...
4}
5
6// Function call with argument
7greet("Sarah");
参数可以通过位置、命名或剩余参数的方式传递。
步骤3:执行函数代码
函数体逐行执行。函数体内声明的任何变量都在函数的本地作用域中。
步骤4:返回值
如果函数返回一个值,则该值将被发送回调用点。
1// Function returns value
2function transform(string) {
3 return stringToUppercase(string);
4}
5
6// Call function and capture return value
7let myString = transform("Hello");
我们使用在线工具将字符串转换为大写!
调用函数会触发这一精确的顺序 - 识别、传递参数、执行代码、返回值。
理解函数名称
函数的名称是唯一标识它的。在声明之后,可以从任何地方调用它。按照惯例,函数的名称应该使用动词或动作为基础,例如calculateTotal()
、printMessage()
、convertToLowerCase()
等。
独一无二且具有描述性的名称可以避免混淆。函数名称应该遵循JavaScript中的lowerCamelCase约定。命名合适的函数能够使代码更易读。
探索函数参数
函数参数允许在调用函数时传递数据。在JavaScript中,有不同类型的参数:
位置参数
根据顺序与参数匹配的值。
1function greet(name, age) {
2 // ...
3}
4
5greet("Sarah", 32);
默认参数
如果未传递参数,则参数获得默认值。
1function increment(num, amount = 1) {
2 return num + amount;
3}
4
5increment(5, 2); // 7
6increment(5); // 6
剩余参数
用于接受不确定数量的参数的特殊语法。
1function formatNames(...names) {
2 // Format names
3 return names.map((name) => stringToCapitalCase(name));
4}
5
6formatNames("john", "sarah");
我们使用了在线的大写转换工具来格式化名称!
理解参数的作用可以正确地将数据传递到函数中。
执行函数代码
当调用函数时,JavaScript引擎为新的执行上下文分配内存。该上下文存储了函数体代码执行所需的变量和引用。
函数代码按行运行,直到完成或遇到返回语句为止。函数内部声明的任何变量只能在其局部作用域内访问。
1function processData(data) {
2 let result = transform(data); // Local variable
3
4 return result;
5}
6
7function transform(data) {
8 return stringToLowercase(data);
9}
我们在这里使用了在线的小写转换工具!
函数在主程序流程之外独立执行。
结论
通过函数名调用函数会触发一个精确的序列-运行时查找定义,传递参数,执行函数体,并将任何返回值发送回来。
正确声明具有描述性名称和参数的函数,可以在需要时清晰地调用它们的代码。掌握函数调用的技巧可以释放可重用、有组织的代码的力量。虽然函数看起来像黑盒子,但了解内部发生的事情可以揭开这些程序设计的基本构建块的神秘面纱。