乐趣区

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

退出移动版