函数原型对象属性

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 '