函数原型对象属性
length 属性
在函数中,arguments 对象的 length 属性表示实参个数,而函数的 length 属性则表示函数希望接受形参个数。
function sayName(name) {
  // do something
}
function sum(num1, num2) {
  // do something
}
function sayHi() {
  // do something
}
console.log(sayName.length); // Output: 1
console.log(sum.length); // Output: 2
console.log(sayHi.length); // Output: 0
name 属性
函数定义了一个非标准的 name 属性,通过这个属性可以访问到给定函数指定的名字,这个属性的值永远等于跟在 function 关键字后面的标识符,匿名函数的 name 属性为空。
// IE11-浏览器无效,均输出undefined
// chrome在处理匿名函数的name属性时有问题,会显示函数表达式的名字
function a() {}
console.log(a.name); // Output: 'fn'
const b = function() {};
console.log(b.name); // Output: '' 在chrome浏览器中会显示'fn'
const c = function abc() {};
console.log(c.name); // Output: 'abc'
- ES6 列入标准
ES6 对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,ES5 的 name 属性,会返回空字符串,而 ES6 的 name 属性会返回实际的函数名。
const fun = function() {};
console.log(fun.name); // ES5: ''
console.log(fun.name); // ES6: 'fun'
如果将一个具名函数赋值给一个变量,则 ES5 和 ES6 的 name 属性都返回这个具名函数原本的名字。
const bar = function baz() {};
console.log(bar.name); // ES5: "baz"
console.log(bar.name); // ES6: "baz"
- 构造函数
Function 构造函数返回的函数实例,name 属性的值为 'anonymous'。
new Function().name; // 'anonymous'
bind 返回的函数,name 属性值会加上 'bound ' 前缀。
function foo() {}
console
  .log(foo.bind({}).name)
  (
    // 'bound foo'
    function() {}
  )
  .bind({}).name; // 'bound '