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