JavaScript函数是Function类型的对象,可赋值传参返回;函数声明会被提升,表达式和箭头函数不提升;箭头函数无this和arguments;参数不足时默认为undefined,可用ES6默认参数或解构处理。
JavaScript 函数不是“某种特殊对象”,它就是 Function 类型的对象——这意味着你可以赋值、传参、返回,甚至动态构造。
最常被忽略的是提升(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"
常见应对方式:
function greet(name, age = 0)
arguments.length(仅适用于传统函数)function({ name = 'Anonymous', age = null } = {}) {...}
真正难的不是语法,是判断该用哪种函数形式——取决于你是否需要 this 绑定、是否要作为构造器、是否在循环中创建闭包,以及是否导出给其他模块复用。