Js中调用函数的四种方式以及调用规则

可以参考:
http://www.cnblogs.com/muxiaoyi/p/6014478.html
在JavaScript中一共有4种调用模式:

函数调用模式
方法调用模式
构造器调用模式
间接调用模式,通过call()和apply()进行
  • 普通函数调用模式
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);
            };
            //方法调用模式,此模式下,this绑定的是方法m所属的对象Object
            myObject.m=printValue;
            printValue();//2,此方法为普通函数调用模式,this是全局对象
            printValue();//2
            console.log(this.value);//1
        };
        myObject.printProps();
        myObject.m();//1

我们注意到,在printValue()函数在执行时,this.value值为2,也就是说,this指向的是全局对象,而不是myObject。

  • 方法调用模式
    上例子中有方法调用模式,
    当一个函数被保存为对象的一个属性时,称为方法。

(1)参数和返回值的处理与函数调用一致;

(2)调用上下文this为该对象

function printValue(){
  console.log(this.value);  
}
var value=1;
var myObject = {value:2};
myObject.m = printValue;
//作为函数调用
printValue();
//作为方法调用
myObject.m();

我们注意到,当调用printValue时,this绑定的是全局对象,打印全局变量value值1。但是当调用myObject.m()时,this绑定的是方法m所属的对象Object,所以打印的值为Object.value,即2。

  • 构造器调用模式
    如果函数或方法调用之前带有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);//1
console.log(o.value);//2
Base(3);
console.log(value);//3
console.log(o.value);//2

I. 第一次调用Base()函数是作为构造函数调用的,此时调用上下文this被绑定到新创建的对象,即o。所以全局变量value值不变,而o新增一个属性value,值为2;

II. 第二次调用Base()函数是作为普通函数调用的,此时调用上下为this被绑定到全局对象,在浏览器中为window。所以全局对象的value值改变为3,而o的属性值不变。

Js中调用函数的四种方式以及调用规则_第1张图片
图片.png

调用规则


http://www.108js.com/article/article1/10095.html?id=709

你可能感兴趣的:(Js中调用函数的四种方式以及调用规则)