function-JavaScrip的一等公民

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.length
2: Function.prototype.name
3: 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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理