length
属性在函数中,arguments
对象的 length
属性表示实参个数,而函数的 length
属性则表示函数希望接受形参个数。
function sayName(name) {// do something}function sum(num1, num2) {// do something}function sayHi() {// do something}console.log(sayName.length); // Output: 1console.log(sum.length); // Output: 2console.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 对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量,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 '