JavaScript是一门函数式语言,function是这门语言的一等公民。所以理解function,我个人觉得是学好JavaScript这门语言最重要的一部分。

function通常作为我们的逻辑单元,通过被调用(call)来完成一个大程序里面的一部分功能。但是在JavaScript里面,一个function可以作为构造函数,通过new关键字来实例化一个对象,例如:

function DOG(){}let dog = new DOG();console.log(dog.constructor === DOG); // true

但是我们常常说:“function是JavaScript的第一型对象(first-class object)”。在这句话里面有个非常重要的信息就是:function是对象

是的,在JavaScript里,function是对象,而且就跟一般的对象一样有属性方法。function与一般对象唯一的区别就是,function可以被调用。那既然function是对象,那他们是否也有构造函数呢?

是的,JavaScript里面所有的function的构造函数都是Function。那既然Function是构造函数,那么是否可以通过new关键字来创建一个对象(也就是一个function)呢?答案是“yes”:

let sum = new Function('a', 'b', 'return a + b');console.log(sum(2, 6)); // 8

用Function来创造一个function的语法是:

new Function ([arg1[, arg2[, ...argN]],] functionBody)

最后一个参数是函数体,前面是参数列表。

但是我们常常不通过Function来new一个function,通常还是利用function字面量来创建一个方法。

funtion的属性和方法

前面我们说到JavaScrip里所有的function都是对象,且他们的构造器(constructor)都是Function,那么所有的function势必会从Function上继承到一些属性和方法。下面我们就来都有哪些:

Function上可用的属性:

1: Function.prototype.length2: Function.prototype.name3: Function.prototype.constructor

Function上可用的方法:

1: Function.prototype.apply()2: Function.prototype.call()3: Function.prototype.bind()4: Function.prototype.toString()

下面我们来对上面几个重要的属性和方法进行讲解:
1: Function.prototype.length -- 函数形参的个数

function testLength(a, b) {    console.log(testLength.length);}testLength(1, 2, 3); // 2

2: Function.prototype.name -- 函数的名字
每一个函数都有一个name属性,它是一个字符串,用来表示这个函数的名字。name这个属性,有些复杂,接下来我们一一来看一下:

3: Function.prototype.constructor