函数声明
函数声明是定义函数的一种方式,使用 function 关键字声明函数。函数声明会在代码执行前被提升(hoisted)到作用域顶部。
语法
javascript
function functionName(parameters) {
// 函数体
return value; // 可选
}基本示例
javascript
// 简单的函数声明
function greet(name) {
return "你好," + name + "!";
}
console.log(greet("张三")); // 输出:你好,张三!
// 无参数函数
function sayHello() {
return "Hello, World!";
}
console.log(sayHello()); // 输出:Hello, World!
// 无返回值函数
function logMessage(message) {
console.log(message);
}
logMessage("这是一条日志信息");函数提升(Hoisting)
函数声明会被提升到作用域顶部,这意味着可以在声明之前调用函数。
javascript
// 在声明之前调用函数
console.log(add(5, 3)); // 输出:8
function add(a, b) {
return a + b;
}参数处理
参数默认值
ES6 允许为函数参数设置默认值:
javascript
function multiply(a, b = 1) {
return a * b;
}
console.log(multiply(5)); // 输出:5
console.log(multiply(5, 3)); // 输出:15剩余参数
使用剩余参数可以接收不定数量的参数:
javascript
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // 输出:6
console.log(sum(1, 2, 3, 4, 5)); // 输出:15参数解构
函数参数也可以使用解构赋值:
javascript
function printPerson({name, age}) {
console.log(`姓名:${name},年龄:${age}`);
}
let person = {name: "李四", age: 30};
printPerson(person); // 输出:姓名:李四,年龄:30函数作用域
函数内部声明的变量具有函数作用域:
javascript
function myFunction() {
let localVar = "局部变量";
console.log(localVar); // 可以访问
}
myFunction();
// console.log(localVar); // 错误:无法访问嵌套函数
函数可以嵌套在其他函数内部:
javascript
function outerFunction() {
let outerVar = "外部变量";
function innerFunction() {
console.log(outerVar); // 可以访问外部函数的变量
}
innerFunction();
}
outerFunction(); // 输出:外部变量递归函数
函数可以调用自身,这称为递归:
javascript
// 计算阶乘
function factorial(n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
console.log(factorial(5)); // 输出:120立即执行函数表达式(IIFE)
虽然 IIFE 是函数表达式,但它与函数声明密切相关:
javascript
// 立即执行函数表达式
(function() {
console.log("这是一个立即执行的函数");
})();
// 带参数的 IIFE
(function(name) {
console.log("你好," + name + "!");
})("张三");函数属性和方法
函数在 JavaScript 中是对象,因此具有属性和方法:
javascript
function myFunction(a, b, c) {
return a + b + c;
}
console.log(myFunction.length); // 输出:3(参数个数)
console.log(myFunction.name); // 输出:"myFunction"(函数名)最佳实践
使用描述性的函数名:函数名应该清楚地表达函数的作用。
保持函数简洁:函数应该只做一件事,并且做好这件事。
合理使用参数:避免函数参数过多,一般来说不超过 3-4 个参数。
注意函数提升:虽然函数声明会被提升,但为了代码可读性,最好在调用之前声明函数。
使用 JSDoc 注释:为函数添加注释,说明参数、返回值和函数作用。
javascript
/**
* 计算两个数的和
* @param {number} a - 第一个数
* @param {number} b - 第二个数
* @returns {number} 两个数的和
*/
function add(a, b) {
return a + b;
}避免在函数内创建全局变量:在函数内使用
let或const声明变量。合理使用递归:递归虽然强大,但要注意避免栈溢出,对于深度递归可以考虑使用迭代替代。