一  前言

  Javascript一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式以及apply调用模式。调用模式不同,对应的隐藏参数this值也会不同。

  二  方法调用模式

  函数作为对象的属性时,称为方法。此时函数(即方法)中的this对应是该对象。

var myObject = {
  value:3,
  func:function(){
    alert(this.value);
  }
  
}; // 方法调用模式,this对应的是myObject对象
myObject.func();  //3

  也可以写成如下格式:

var myObject = {
value:
}; myObject.func = function() {
alert(this.value);
} // 方法调用模式
myObject.func();  //3

  上面,this对应的是myObject对象。

  三  函数调用模式

  函数调用模式即通常的函数调用,属于全局性调用,此时this对应的是全局对象,即Window对象。

var add = function(a, b) {
return a + b;
}

// 函数调用模式
add(,); //

  上面也可以写成

window.add = function(a, b) {
return a + b;
} // 函数调用模式
add(3,4); //7

  下面来看看下面的测试题,以检验你是否了解了this。

<script type="text/javascript">
var add = function(a, b) {
return a + b;
} var myObject = {
value:
}; myObject.func = function() {
var helper = function() {
this.value = add(this.value, this.value);
}

    // 函数调用模式
  helper();
}

  // 方法调用模式
   myObject.func();
alert(myObject.value); </script>

  答案会是6吗?仔细想想。

  答案为6的程序应该是这样的:

<script type="text/javascript">
var add = function(a, b) {
return a + b;
} var myObject = {
value:
}; myObject.func = function() {
var that = this; // this对应myObject对象 (1)
var helper = function() {
//this.value = add(this.value, this.value); //这里调用模式为函数调用模式,而非方法调用模式,所以this对应全局对象 (2)
that.value = add(that.value, that.value);
}
    
    // 函数调用模式
  helper();
}

  // 方法调用模式
   myObject.func();
alert(myObject.value); </script>

  (1)处this在firefox调试如下:(方法调用模式处)

  

  (2)处this在firefox调试如下:(函数调用模式处)

  

  四  构造器调用模式

  若在函数前面通过new 来调用,其实是生成一新对象,this自然指向该新对象。

var add = function(a, b) {
return a + b;
}

// 构造器调用模式
var obj = new add(, );

  obj为一对象:

  

  对于构造器调用模式,如果函数返回值不是一个对象,则返回该新对象,即this。

  五  apply调用模式

  apply方法有两个参数,第一个是要绑定给this的值,第二个是一个参数数组。
// apply调用模式
var sum = add.apply(null,[,]); // this对应全局变量,即window对象
var sum2 = add.apply(myObject,[,]); //this对应为myObject对象

  六  源码

  源码下载。

Javascript函数调用的四种模式的更多相关文章

  1. OAuth2简易实战(一)-四种模式

    1. OAuth2简易实战(一)-四种模式 1.1. 授权码授权模式(Authorization code Grant) 1.1.1. 流程图 1.1.2. 授权服务器配置 配置授权服务器中 clie ...

  2. 函数调用的四种方式 和 相关的 --- this指向

    this:表示被调用函数的上下文对象. arguments:表示函数调用过程中传递的所有参数. 这两个参数都是隐式的函数参数.会静默传递给函数,并且和函数体内显式声明的参数一样可正常访问. argum ...

  3. 第164天:js方法调用的四种模式

    js方法调用的四种模式 1.方法调用模式 function Persion() { var name1 = "itcast", age1 = 19, show1 = functio ...

  4. IdentityServer4实现Oauth2.0四种模式之隐藏模式

      接上一篇:IdentityServer4实现OAuth2.0四种模式之密码模式,密码模式将用户的密码暴露给了客户端,这无疑是不安全的,隐藏模式可以解决这个问题,由用户自己在IdentityServ ...

  5. IdentityServer4实现OAuth2.0四种模式之授权码模式

    接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...

  6. Hibernate 查询MatchMode的四种模式

    Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...

  7. Android 文件访问权限的四种模式

    Linux文件的访问权限* 在Android中,每一个应用是一个独立的用户* drwxrwxrwx* 第1位:d表示文件夹,-表示文件* 第2-4位:rwx,表示这个文件的拥有者(创建这个文件的应用) ...

  8. 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

    一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码:   四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ...

  9. Asp.net的sessionState四种模式配置方案

    sessionState节点的配置 web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer ...

随机推荐

  1. 【Cocos2d-x 3.x】 事件处理机制源码分析

    在游戏中,触摸是最基本的,必不可少的.Cocos2d-x 3.x中定义了一系列事件,同时也定义了负责监听这些事件的监听器,另外,cocos定义了事件分发类,用来将事件派发出去以便可以实现相应的事件. ...

  2. Oracle执行时间与sql格式

    今天碰到一个很奇怪的问题,直接在eclipse中将sql拷出,然后直接粘贴复制在数据库中就会执行的非常慢,但是在利用plsql对sql语句进行格式整理之后,执行的速度就非常的快,之后我where条件中 ...

  3. 微信公众号开发之被逼学web服务端1-----使用SecureCRT连接Linux服务器

    做Android的进新公司后安排做微信公众号开发,这基本是后台和前端的活都要由小白的我来做,这两天基本成鸭子了,被填的满满的,却还是不够,博文仅作记录,希望能给后来的小白一点参考吧 今天做的是如何配置 ...

  4. Android NDK几点回调方式

    一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...

  5. ueditor 上传的图片在内容里显示的尺寸过大的问题

    没改动之前是上面这样的,图片显示不开,撑出了滚动条,想让他自适应100%,不出现滚动条 网上有方法 1.ueditor 的 themes 文件夹下有个iframe.css 加入以下代码,保存(原先的c ...

  6. AJAX 状态值(readyState)与状态码(status)详解

    总结:status体现的是服务器对请求的反馈,而readystate表明客户端与客户的交互状态过程. 1- AJAX状态值与状态码区别AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成 ...

  7. while 循环

    while(condition) { //........ } 循环在我们从事C语言开发的过程中可以说用的挺多的,但是今天想起了一个问题,源于我要在一个长字符串中查找特定字符串,于是我写了如下代码: ...

  8. oracle中的rownum

    1.oracle存在rownum关键字,它是一个伪列(系统分配在结果集上的一个特殊列) SELECT * FROM  oracleTable WHERE ROWNUM=1 上面这条语句是能够查询出第一 ...

  9. 开始使用Pyhton

    安装 第一个Python程序 首先我们打开python 交互式解释器, 执行如下命令: Python 3.5.1+ (default, Mar 30 2016, 22:46:26) [GCC 5.3. ...

  10. InfoPi运行机制介绍

    整体工作框架 文件目录结构 数据库设计 程序开发框架 注:图片可能被自动缩小,可以另存看大图 1.整体工作框架. 通用户关注绿色竖线左侧的内容即可 2.InfoPi的文件目录结构. 请留意一下cfg目 ...