啊在经过函数的定义后,需要在程序中对函数进行调用才能使自定义函数执行。
调用方法有四种:
- 函数调用
- 方法调用
- 构造函数调用
- 通过call()和apply()间接调用
1 函数调用
使用调用表达式就可以进行函数的调用,一个调用表达式由多个函数表达式构成,每个函数表达式都是由函数对象和左圆括号(“(”)、参数列表、和右圆括号(“)”)组成,参数列表由带有逗号(“,”)分隔的零个或多个参数表达式组成。
函数名([参数1,参数2]);
对于参数列表来说,他们是可有可不有的。当需要外部数值进行传入的时候就可以进行参数的书写,这一部分参数就函数而言全是形参,当接收到值了后,将接收的值用于函数执行过程中,这些值就是实参。
3.2.2 方法调用
一个方法究其本质是一个对象的属性中所包含的JavaScript函数,假定有一个函数f、一个对象o
//给对象o定义一个名为m()的方法
o.m=f;
//在给对象o定义了方法m()后,调用它
o.m();
//如果m需要两个实参
o.m(a,b);
我们可以看见,上面的示例中存在属性访问表达式,即访问的是对象o的m属性。
方法调用和函数调用之间有个区别:调用上下文。属性访问表达式由一个对象和属性名称,在上面的例子中,对象o就是调用上下文,函数体可以使用this调用当前对象。
var addN={
num1: 1,
num2: 2,
operation: function(){
this.result = this.num1+this.num2;
}
};
addN.operation();
addN.result;
在这个例子中我们定义了一个对象addN,其有三个属性num1、num2和operation,其中operation绑定了一个函数function(),里面使用this关键字调用当前对象:addN,函数体中使得addN的result等于num1和num2的和,其中result是在方法中新定义的一个属性值。
随后我们引用对象的方法operation(),使得operation()执行方法体内的JavaScript代码,最后调用addN的result属性值。
而在这个示例中,addN就是调用上下文。
3.2.3 构造函数调用
如果函数或者方法调用前有关键字new,就实现了构造函数调用
var a = new Object();
var a = newObject;
上面两个定义实际上是等价的,如果在进行构造函数调用的时候没有形参定义的话,在进行构造函数的时候可以把括号省略
构造函数调用创建一个新的空对象,这个对象继承自构造函数的prototype属性。构造函数试图初始化这个新创建的对象,并将这个对象用作其调用上下文,因此构造函数可以使用this关键字来引用这个新创建的对象。注意:尽管构造函数看起来像是一个方法调用,它依然会使用这个新对象作为调用上下文。即在new o.m()中,o并不是调用上下文。
构造函数不适用return作为关键字,它们常常初始化新对象,当构造函数的函数体执行完后,它会显式返回。在这种情况下,构造函数调用表达式的计算结果就是这个新对象的值。然而如果构造函数显示的使用return语句返回一个对象,那么调用表达式的值就是这个对象。如果构造函数使用return语句但没有置顶返回值,或者返回一个原始值,那么这个时候返回值将忽略,同时使用这个新对象作为调用结果。
4 通过call()和apply()间接调用
在JavaScript中,函数的本质就是对象,且与其他的JavaScript对象并无二致,函数对象也能包含方法。其中call()和apply()可以来间接地调用函数。两个方法都允许显示指定调用所需要的this值,也就是说,任何函数可以作为任何对象的方法来调用,哪怕这个函数不是那个对象的方法。连个方法都可以置顶调用的实参。Call()方法使用其自由的实参列表作为函数的实参,apply()方法则要求以数组的形式传入参数。
注意:call()方法和apply()方法是个函数就有,他们不是继承来的。
引用函数.call(被引用函数[,参数1,参数2]);
引用函数.apply(被引用函数[,[参数1,参数2]]);
引用函数:需要引用数据的函数
被引用函数:存在引用数据的函数
参数:当需要引入实参的时候才进行编写,call()函数将参数一个个罗列出来,apply()函数将引用的参数以数组的形式传入参数
function add(a,b){
return this.num1+this.num2+a+b;
}
var data={
num1:1,
num2:2
};
console.log(add.call(data,3,4));
console.log(add.apply(data,[4,5]));
在这里涉及到了利用JSON创建对象,相关代码可以这么理解:利用JSON创建了一个对象,它有两个键num1和num2,对应的值为1和2。
这里有一个方法add(),方法内涉及到实参a,b,这里我们发现存在num1和num2两个值在add中是没有对应的值。因为apply()和call()都是公有方法,故直接add.call()或add.apply()数据来源是data对象,随便传入几个实参。这样的话本代码在浏览器的开发者模式中的控制台中就能直接看到值了。