函数调⽤的四种⽅式
在JavaScript中⼀共有4种调⽤模式:
函数调⽤模式
⽅法调⽤模式
构造器调⽤模式
间接调⽤模式,通过call()和apply()进⾏
1. 函数调⽤模式
普通函数调⽤模式,如:
function printProps(o){
……
}
printProps({x:1});
在⼀个调⽤中,
(1)每个参数表达式计算的结果作为实参传递给声明函数时定义的形参;
(2)this被绑定到全局变量
var myObject = {value:1};
value = 2;
myObject.printProps = function(){
var printValue = function(){
console.log(this.value);
};
printValue();
console.log(this.value);
}
myObject.printProps();
此时的运⾏结果是:
2
1
我们注意到,在printValue()函数在执⾏时,this.value值为2,也就是说,this指向的是全局对象,⽽不是myObject。
(3)返回值:函数的返回值成为调⽤表达式的值。I. 如果函数返回是解释器到达结尾,也就是没有执⾏到return XXX的语句。返回值为undefined。 II. 如果函数返回是因为接受器执⾏到return xxx语句,返回return之后的值。 III. 如果return语句后没有值,即return,则返回undefined。
2. ⽅法调⽤模式
当⼀个函数被保存为对象的⼀个属性时,称为⽅法。
(1)参数和返回值的处理与函数调⽤⼀致;
(2)调⽤上下⽂this为该对象
function printValue(){
console.log(this.value);
}
var value=1;
var myObject = {value:2};
myObject.m = printValue;
//作为函数调⽤
printValue();
/
/作为⽅法调⽤
myObject.m();
运⾏结果为:
1
2
我们注意到,当调⽤printValue时,this绑定的是全局对象,打印全局变量value值1。但是当调⽤myObject.m()时,this绑定的是⽅法m所属的对象Object,所以打印的值为Object.value,即2。
函数调⽤模式⽅法调⽤
模式
构造器调⽤模式间接调⽤模式
实参处理参数表达式运⾏结果作
为实参传递给函数形参
与函数调
⽤模式⼀
⼀般情况,与函数调⽤模式⼀致
但如果构造函数没⽤形参,JavaScript构造函数调⽤语法是
允许省略实参列表和圆括号的
call()⽅法使⽤它⾃有的实参列表作
为函数的实参
apply()⽅法要求以数组的形式传⼊
参数
调⽤
上下⽂指向全局变量
指向⽅法
所属的对
指向新创建的对象
允许显⽰的指定调⽤所需的this
值,为call()或apply()中的第⼀个参
返回值I. 没有执⾏到return语
句,返回undefined
II. 执⾏到return xxx语
句,返回return之后的
III. retrun后没有值,返
回undefined
与函数调
⽤模式⼀
javascript全局数组致
构造函数通常不使⽤return关键字,返回值就是新对象。
如果构造函数显⽰地使⽤return语句返回⼀个对象,那么调⽤
表达式值就为这个对象。
如果构造函数使⽤return语句但没有指定返回值或者返回⼀个
原始值,则忽略返回值,同时使⽤新对象作为调⽤结果。
3. 构造器调⽤模式
如果函数或⽅法调⽤之前带有new关键字,它就构成构造函数调⽤。如:
function F(){……}
var o = new F();
(1)参数处理:⼀般情况构造器参数处理和函数调⽤模式⼀致。但如果构造函数没⽤形参,JavaScript构造函数调⽤语法是允许省略实参列表和圆括号的。
如:下⾯两⾏代码是等价的。
var o = new Object();
var o = new Object;
(2)函数的调⽤上下⽂为新创建的对象。
function Base(value){
this.value =value;
}
var value =1;
var o = new Base(2);
console.log(value);
console.log(o.value);
Base(3);
console.log(value);
console.log(o.value);
运⾏结果:
1
2
3
2
I. 第⼀次调⽤Base()函数是作为构造函数调⽤的,此时调⽤上下⽂this被绑定到新创建的对象,即o。所以全局变量value值不变,⽽o新增⼀个属性value,值为2;
II. 第⼆次调⽤Base()函数是作为普通函数调⽤的,此时调⽤上下为this被绑定到全局对象,在浏览器中为window。所以全局对象的value值改变为3,⽽o的属性值不变。
(3)构造函数通常不使⽤return关键字,返回值就是新对象。⽽如果构造函数显⽰地使⽤return语句返回⼀个对象,那么调⽤表达式值就为这个对象。如果构造函数使⽤return语句但没有指定返回值或者返回⼀个原始值,则忽略返回值,同时使⽤新对象作为调⽤结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。