介绍
JavaScript函数是执行特定任务的代码块,可通过多种方式定义。传统函数声明使用function关键字,后接函数名和参数列表,这种声明会被提升至作用域顶部。函数表达式则将匿名或具名函数赋值给变量,遵循变量作用域规则,常用于回调场景。箭头函数采用=>语法,省略function关键字,具备词法作用域特性,其this值继承自外部上下文。构造函数通过new Function()`动态生成函数,但较少使用。所有函数都是对象,可拥有属性和方法,支持闭包实现数据封装。参数可接受默认值及剩余参数,返回值由return决定,未显式返回则默认undefined。函数定义方式的选择直接影响作用域、提升行为和this绑定机制。
函数定义方式
JavaScript函数定义方式包括:1. 函数声明;2. 函数表达式;3. 箭头函数;4. Function构造函数;5. ES6简写方法。
函数声明(Function Declaration)
function add(a, b) {return a + b;
}
-
提升(Hoisting):函数声明会被提升到作用域顶部,可在定义前调用。
-
命名函数:拥有name属性(如add.name == 'add')。
函数表达式(Function Expression)
const multiply = function(a, b) { return a * b;
};
-
匿名或命名:可省略函数名(匿名函数),但命名有助于调试。
-
无提升:必须先定义后调用。
箭头函数(Arrow Function, ES6+)
const square = (x) => x * x;
-
简写语法:单参数可省略括号,单表达式可省略return。
-
无自身this:继承外层上下文,适合回调、数组方法。
-
不能作为构造函数:不可用new调用。
构造函数(Function)
const divide = new Function('a', 'b', 'return a / b');
-
动态创建函数:字符串参数,存在安全性和性能问题,极少使用。
生成器函数(Generator Function, ES6+)
function* gen() { yield 1; }
-
可暂停执行:通过yield返回值,用next()逐步执行。
参数处理
JavaScript函数参数处理支持形参声明、默认值、剩余参数,实参通过arguments对象访问。基本类型按值传递,对象按引用传递,支持动态数量参数。
默认参数(ES6+)
function greet(name = 'Guest') {console.log(`Hello, ${name}!`);
}
剩余参数(Rest Parameters, ES6+)
function sum(...numbers) {return numbers.reduce((acc, num) => acc + num, 0);
}
参数解构
function printUser({ name, age }) {console.log(`${name} is ${age} years old.`);
}
方法定义
JavaScript函数方法定义通常在对象或类中,使用ES6简写、传统函数表达式、箭头函数(this绑定差异)及getter/setter访问器方法等形式。
对象方法
const obj = {// 传统方法log: function() { console.log(this); },// ES6 简写log() { console.log(this); },// 箭头函数(this 指向外层)arrowLog: () => console.log(this)
};
类方法(ES6+)
class Calculator {add(a, b) { return a + b; }static multiply(a, b) { return a * b; }
}
关键区别与注意事项
特性 | 函数声明 | 函数表达式 | 箭头函数 |
---|---|---|---|
提升 | ✔ 是 | ✘ 否 | ✘ 否 |
拥有this | ✔ 动态绑定 | ✔ 动态绑定 | ✘ 继承外层 |
可作为构造函数 | ✔ 是 | ✔ 是 | ✘ 否 |
arguments对象 | ✔ 有 | ✔ 有 | ✘ 无 |
-
箭头函数适用场景:需要固定this的回调(如setTimeout、map)。
-
避免箭头函数:对象方法、原型方法、事件处理器(需动态this时)。
建议
-
优先使用函数声明或箭头函数,根据this需求选择。
-
使用默认参数替代
||
默认值处理。 -
复杂函数建议命名,便于调试和递归。
-
避免Function构造函数,防止安全漏洞。
总结
JavaScript函数是代码复用的核心单元,支持多种定义方式满足不同场景需求。传统函数声明通过function关键字定义,具有函数名和函数体,会被提升至作用域顶部,适合常规功能封装。函数表达式则将函数赋值给变量,支持匿名或命名形式,不会提升,常用于条件分支或回调场景。ES6引入的箭头函数采用=>语法,省略function关键字,继承外层上下文this绑定,适合简洁的回调函数和避免this指向问题。
对象方法可采用传统函数定义,也可使用ES6方法简写形式method(){},两者均能通过对象访问。构造函数通过new调用时自动绑定实例到this,用于创建特定类型的对象。生成器函数通过function*定义,配合yield实现暂停执行,适用于异步迭代场景。
函数参数支持默认值设定,可通过剩余参数...args接收不定量参数,配合解构赋值提升灵活性。所有函数类型均具备name属性标识名称,length属性反映形参数量。需注意箭头函数没有arguments对象和prototype属性,不可作为构造函数使用。理解不同定义方式的特性差异,能够根据作用域、this绑定和复用需求选择最佳实现方案。