函数调用方式:
1作为函数
2作为方法
3作为构造函数
4通过call()和apply()间接调用
函数调用:使用调用表达式可以进行普通的函数调用也可以进行方法调用。若函数表达式是一个属性访问表达式,即该函数是一个对象的属性或数组中的一个元素,那么他就是一个方法调用表达式。
普通调用表达式:
foo({x:1});
var total=aaa(0,1,2)+bbb(4,5,6);
var ccc=ddd(5)/ddd(6);
对于普通函数调用,函数返回值成为调用表达式的值。若该函数返回是因为解析器到达结尾,返回值就是undefined。若函数返回是因为执行一条return语句,返回值就是return之后的表达式的值。若return语句没有值,则返回undefined。
方法调用:
一个方法无非是个保存在J一个对象的属性里的avaScript函数。若有一个函数f和一个对象o,则可用以下代码给o定义一个m()的方法:
o.m=f;//给o对象定义了一个方法m();
调用时:o.m();
方法调用和函数调用的区别:调用上下文不同。属性访问表达式由两部分组成:一个对象和属性名称。在这样的方法调用表达式里,对象成为调用上下文。函数体可以使用关键字this引用该对象。
this:this关键字没有作用域的限制。嵌套的函数不会从调用它的函数中继承this。若嵌套函数作为方法调用,其this值指向调用它的对象。若嵌套函数作为函数调用,其this值不是全局对象(非严格模式)就是undefined(严格模式)。注意:调用嵌套函数时,this不会指向调用嵌套函数外层函数的上下文。若想访问这个外部函数的this值,需要将this值保存在一个变量里,这个变量和内部函数同在一个作用域。
构造函数调用:
若函数或者方法前面带有关键字new,它就构成构造函数调用。JavaScript构造函数调用语法允许实参列表和()。
eg:var o=new Object();与var o=new Object;等价。
构造函数将创建一个新对象。这个对象继承自构造函数的prototype属性。构造函数试图初始化这个新创建的对象。并将这个对象用作其调用山下文。因此,构造函数可以使用this关键字引用这个新创建的对象。注意:尽管构造函数看起来像一个方法调用,它依然会使用这个新对象作为调用上下文,即:在表达式new o.m()中,调用上下文并不是o。
间接调用:call()和apply()方法。