1.

函数的申明

JavaScript 有三种申明函数的办法。

(1)function 命令

function命令申明的代码区块,就是一个函数。function命令前面是函数名,函数名前面是一对圆括号,外面是传入函数的参数。函数体放在大括号外面。

function print(s) {  console.log(s);}

(2)函数表达式

除了用function命令申明函数,还能够采纳变量赋值的写法。

var print = function(s) {  console.log(s);};

采纳函数表达式申明函数时,function命令前面不带有函数名。如果加上函数名,该函数名只在函数体外部无效,在函数体内部有效。

var print = function x(){  console.log(typeof x);};x// ReferenceError: x is not definedprint()// function

(3)Function 构造函数

第三种申明函数的形式是Function构造函数。

var add = new Function(  'x',  'y',  'return x + y');// 等同于function add(x, y) {  return x + y;}

2.函数的反复申明

如果同一个函数被屡次申明,前面的申明就会笼罩后面的申明。

function f() {  console.log(1);}f() // 2function f() {  console.log(2);}f() // 2

3.length 属性

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

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

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

4.toString()

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

function f() {  a();  b();  c();}f.toString()// function f() {//  a();//  b();//  c();// }

5.arguments 对象

(1)定义

因为 JavaScript 容许函数有不定数目的参数,所以须要一种机制,能够在函数体外部读取所有参数。这就是arguments对象的由来。

arguments对象蕴含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体外部,才能够应用。

var f = function (one) {  console.log(arguments[0]);  console.log(arguments[1]);  console.log(arguments[2]);}f(1, 2, 3)// 1// 2// 3

失常模式下,arguments对象能够在运行时批改。

(2)与数组的关系

须要留神的是,尽管arguments很像数组,但它是一个对象。数组专有的办法(比方sliceforEach),不能在arguments对象上间接应用。

如果要让arguments对象应用数组办法,真正的解决办法是将arguments转为真正的数组。上面是两种罕用的转换方法:slice办法和逐个填入新数组。

var args = Array.prototype.slice.call(arguments);// 或者var args = [];for (var i = 0; i < arguments.length; i++) {  args.push(arguments[i]);}

(3)callee 属性

arguments对象带有一个callee属性,返回它所对应的原函数。