跳到主要内容

函数名与提升

函数名的本质是什么?​

  • 语义: 函数名是指向函数对象的指针, 同一个函数可以有多个名字;
  • 表现: 给另一个变量赋函数名后, 原名字置空也不影响新引用;
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 或参数类型, 或使用不同函数名;