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的属性值不变。

图片.png

<h2>调用规则</h2>
http://www.108js.com/article/article1/10095.html?id=709

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,680评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,809评论 18 399
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,689评论 0 4
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,140评论 2 17
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 4,065评论 0 7

友情链接更多精彩内容