JavaScript函数是Function类型的对象,可赋值传参返回;函数声明会被提升,表达式和箭头函数不提升;箭头函数无this和arguments;参数不足时默认为undefined,可用ES6默认参数或解构处理。

JavaScript 函数不是“某种特殊对象”,它就是 Function 类型的对象——这意味着你可以赋值、传参、返回,甚至动态构造。
函数声明 vs 函数表达式:行为差异比写法更重要
最常被忽略的是提升(hoisting)行为不同:
-
function foo() {}会被完全提升,可在定义前调用 -
const foo = function() {}或const foo = () => {}不提升,访问会报ReferenceError -
function声明在块级作用域(如if内)中,不同浏览器行为不一致,应避免
现代代码更倾向函数表达式或箭头函数,尤其在模块导出、回调、事件处理器中。
箭头函数没有自己的 this 和 arguments
这是最易踩坑的点。当你需要绑定上下文时:
立即学习“Java免费学习笔记(深入)”;
- 方法内写
setTimeout(() => console.log(this.value), 100)—— ✅ 正确继承外层this - 但写
setTimeout(function() { console.log(this.value) }, 100)—— ❌this指向全局或undefined(严格模式) - 若需
arguments,必须用传统函数:function() { console.log(arguments[0]) };箭头函数里访问arguments会报ReferenceError
调用时传参少于形参?不会报错,只是值为 undefined
JavaScript 不校验参数个数。例如:
function greet(name, age) {
console.log(`Hi ${name}, you are ${age}`);
}
greet('Alice'); // 输出 "Hi Alice, you are undefined"
常见应对方式:
- ES6 默认参数:
function greet(name, age = 0) - 检查
arguments.length(仅适用于传统函数) - 用解构 + 默认值:
function({ name = 'Anonymous', age = null } = {}) {...}
真正难的不是语法,是判断该用哪种函数形式——取决于你是否需要 this 绑定、是否要作为构造器、是否在循环中创建闭包,以及是否导出给其他模块复用。










