1. 获取函数名:f.name
  2. 获取函数预期接收的参数数量:f.length
  3. 将函数源码以字符串形式输出:f.toString()

name 属性

函数的name属性返回函数的名字。

  1. function f1() {}
  2. f1.name // "f1"

如果是通过变量赋值定义的函数,那么name属性返回变量名。

  1. var f2 = function () {};
  2. f2.name // "f2"

但是,上面这种情况,只有在变量的值是一个匿名函数时才是如此。如果变量的值是一个具名函数,那么name属性返回function关键字之后的那个函数名。

  1. var f3 = function myName() {};
  2. f3.name // 'myName'

上面代码中,f3.name返回函数表达式的名字。注意,真正的函数名还是f3,而myName这个名字只在函数体内部可用。

name属性的一个用处,就是获取参数函数的名字。

  1. var myFunc = function () {};
  2. function test(f) {
  3. console.log(f.name);
  4. }
  5. test(myFunc) // myFunc

上面代码中,函数test内部通过name属性,就可以知道传入的参数是什么函数。

length 属性

函数的length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。

  1. function f(a, b) {}
  2. f.length // 2

上面代码定义了空函数f,它的length属性就是定义时的参数个数。不管调用时输入了多少个参数,length属性始终等于2。

length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的“方法重载”(overload)。

toString()

函数的toString()方法返回一个字符串,内容是函数的源码。

  1. function f() {
  2. a();
  3. b();
  4. c();
  5. }
  6. f.toString()
  7. // function f() {
  8. // a();
  9. // b();
  10. // c();
  11. // }

上面示例中,函数ftoString()方法返回了f的源码,包含换行符在内。

对于那些原生的函数,toString()方法返回function (){[native code]}

  1. Math.sqrt.toString()
  2. // "function sqrt() { [native code] }"

上面代码中,Math.sqrt()是 JavaScript 引擎提供的原生函数,toString()方法就返回原生代码的提示。

函数内部的注释也可以返回。

  1. function f() {/*
  2. 这是一个
  3. 多行注释
  4. */}
  5. f.toString()
  6. // "function f(){/*
  7. // 这是一个
  8. // 多行注释
  9. // */}"

利用这一点,可以变相实现多行字符串。

  1. var multiline = function (fn) {
  2. var arr = fn.toString().split('\n');
  3. return arr.slice(1, arr.length - 1).join('\n');
  4. };
  5. function f() {/*
  6. 这是一个
  7. 多行注释
  8. */}
  9. multiline(f);
  10. // " 这是一个
  11. // 多行注释"

上面示例中,函数f内部有一个多行注释,toString()方法拿到f的源码后,去掉首尾两行,就得到了一个多行字符串。