函数名与提升
函数名的本质是什么?
- 语义: 函数名是指向函数对象的指针, 同一个函数可以有多个名字;
- 表现: 给另一个变量赋函数名后, 原名字置空也不影响新引用;
function sum(a, b) {
return a + b;
}
const anotherSum = sum;
sum = null;
anotherSum(10, 10); // 20
name属性: 只读属性, 保存函数名;
function foo() {}
foo.name; // "foo"
new Function().name; // "anonymous"
匿名函数的 name 是什么?
- 语义: 箭头函数与函数表达式创建的函数没有名字, 其
name为空字符串或"anonymous"; - 推断: 赋值给变量时,
name取变量名;
(() => 1).name; // ""
const fn = () => 1;
fn.name; // "fn"
函数声明与函数表达式在提升上有什么不同?
- 函数声明: 整体提升, 声明前即可调用;
- 函数表达式: 只提升变量声明, 赋值前调用报错;
console.log(sum(10, 10)); // 20
function sum(a, b) {
return a + b;
}
console.log(sum2(10, 10)); // TypeError
var sum2 = function (a, b) {
return a + b;
};
JavaScript 支持函数重载吗?
- 结论: 不支持;
- 原因: 同名函数后者覆盖前者, 且调用时不会按参数类型或数量分派;
- 替代: 在函数体内检查
arguments.length或参数类型, 或使用不同函数名;