Javascript函数调用的四种模式
一 前言
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调用模式
var sum = add.apply(null,[,]); // this对应全局变量,即window对象
var sum2 = add.apply(myObject,[,]); //this对应为myObject对象
六 源码
Javascript函数调用的四种模式的更多相关文章
- OAuth2简易实战(一)-四种模式
		1. OAuth2简易实战(一)-四种模式 1.1. 授权码授权模式(Authorization code Grant) 1.1.1. 流程图 1.1.2. 授权服务器配置 配置授权服务器中 clie ... 
- 函数调用的四种方式  和  相关的 --- this指向
		this:表示被调用函数的上下文对象. arguments:表示函数调用过程中传递的所有参数. 这两个参数都是隐式的函数参数.会静默传递给函数,并且和函数体内显式声明的参数一样可正常访问. argum ... 
- 第164天:js方法调用的四种模式
		js方法调用的四种模式 1.方法调用模式 function Persion() { var name1 = "itcast", age1 = 19, show1 = functio ... 
- IdentityServer4实现Oauth2.0四种模式之隐藏模式
		接上一篇:IdentityServer4实现OAuth2.0四种模式之密码模式,密码模式将用户的密码暴露给了客户端,这无疑是不安全的,隐藏模式可以解决这个问题,由用户自己在IdentityServ ... 
- IdentityServer4实现OAuth2.0四种模式之授权码模式
		接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ... 
- Hibernate 查询MatchMode的四种模式
		Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ... 
- Android 文件访问权限的四种模式
		Linux文件的访问权限* 在Android中,每一个应用是一个独立的用户* drwxrwxrwx* 第1位:d表示文件夹,-表示文件* 第2-4位:rwx,表示这个文件的拥有者(创建这个文件的应用) ... 
- 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
		一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码: 四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ... 
- Asp.net的sessionState四种模式配置方案
		sessionState节点的配置 web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer ... 
随机推荐
- 因为换工作,需要学习CCNA的课程
			听说集齐7个CCIE就可以召唤神龙,不知道是不是真的,从CCNA开始吧! 加油!!! 
- 启动odoo-10.0成功,但是访问时出错
			启动odoo-10.0显示成功 2017-01-05 06:49:48,211 532 INFO ? odoo: Odoo version 10.02017-01-05 06:49:48,211 53 ... 
- CRT 和mysql 中文乱码解决方式
			mysql 安装mysql 1. 使用root用户: su root 2. 安装 yum install mysql yum install mysql-server yum install mysq ... 
- WindowsAPI开发常用资料
			主类 子类 功能 Win32API SHGetSpecialFolderLocation 获取系统特殊文件夹路径(SHGetSpecialFolderLocation) 通过 SHGetSpecial ... 
- Qt QAxObject操作excel文件过程总结(转):
			正好同事问道Qt下操作excel. 转自:http://blog.csdn.net/a156392343/article/details/48092515 配制方面: 1.确保Excel软件在本地服务 ... 
- Python之路,day11-Python基础
			回顾:进程一个程序需要运行所需的资源的集合每个进程数据是独立的每个进程里至少有一个线程进程里可以有多个线程线程数据是共享的一个进程的多个线 6程可以充分利用多核cpumultiprocessing p ... 
- xmind8
			win10企业版安装 xmind.zip,打开应用程序报下面的错 解决办法是 先备份xmind8下的XMind.ini文件 Open up Xmind.ini and replace "Ap ... 
- 数据库中Schema和Database有什么区别
			在MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL Server和Orcal数据库中好像又不一样. 目前我只能理解,在mysql中 schema<==> ... 
- SQL 递归树 子父节点相互查询
			if object_id('[tb]') is not null drop table [tb] go create table [tb]([modeid] int,modename varchar( ... 
- mysql处理高并发,防止库存超卖
			先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购一个商品.然而,作为活动商品,库存肯定是很有限的,如何控 ... 
