JavaScript 再认识(一):Function调用模式对this的影响
近来,学习了一下《JavaScript精粹》,读到了函数这章,理清了JavaScript中this在不同调用模式下的指向。
1、Function调用模式:Function是JavaScript的一种引用类型,拥有四种调用模式:方法调用模式,函数调用模式,构造器调用模式,apply(call, bind)调用模式
2、Function的不同调用模式对this产生不同的影响:
(1)方法调用模式:Function作为对象的方法被调用。此时,this指向调用Function的对象。
var obj = {
name: "lucy",
printName: function( ) {
console.log( this.name ); // 此时printName,作为obj的方法被调用,this指向调用printName的obj,this.name === "lucy"。
}
};
(2)构造器调用模式:Function作为构造器被调用,亦即使用new操作符,创建新的对象实例,并且将this指向新创建的对象实例;同时,执行构造器内的代码为新的对象实例添加成员,最后返回这个新的对象实例。
// 创建构造器Demo,在Demo被new操作符调用时,this指向Demo的prototype。
var Demo = function( ){
this.name = "jack";
}; // 在Demo的prototype中,添加方法printName。
Demo.prototype.printName = function( ){
console.log(this.name);
}; // 创建Demo实例,此时this已经指向Demo的prototype
var d = new Demo( );
console.log(d.name); // 在控制台输出"jack"
d.printName( ); // 在控制台输出"jack"
PS:构造函数、构造器只是在英译中的过程中的翻译用词差异,在英文都是constructor。《JavaScript精粹》译为构造器,《JavaScript高级程序设计》第三版译为构造函数。
(3)apply(call, bind)调用模式:JavaScript中,函数也是对象而具有方法,其具有方法apply。apply接受两个参数,第一个是要传递给this的值,第二个是参数数组。当函数调用apply方法时,将函数内部的this指向apply传递的第一个参数。
var people = {
this.name = "lily";
}
var printName = function( ){
console.log(this.name)
}
// 此时apply将this指向了people
printName.apply(people) // 在控制台输出 lily
PS:《JavaScript精粹》中只提及apply。apply和call在功能上是相同的,但是具体的使用方式上,有小差异。
(4)函数调用模式:既不是作为方法调用,也不是调用自己的apply(call, bind),也不是作为构造器被new调用,这时候调用就是函数调用模式。此时函数内部的this指向全局变量,在浏览器中指的是window变量,在node.js中指的是global变量。
window.name = "bob"; // 此时this指向window
var printName = function( ) {
console.log( this.name );
}; console.log(window.name) // 在控制台输出bob
printName() // 在控制台输出bob
以setTimeout(callback, time)为例:
window.name = "bush"; // 在全局作用域
setTimeout(function( ){
console.log(this.name); // 在控制台输出"bush"
}, 100); // 在对象方法内部
var obj = {
name : "trump",
printName : function( ){
var _this = this;
setTimeout(function( ){
console.log(_this.name); // 在控制台输出"trump"
console.log( this.name ); // 在控制台输出"bush"
}, 1000);
}
};
obj.printName();
3、小结:
(1)方法调用模式:this指向调用方法的对象。
(2)构造器调用模式:this指向构造器的创建的实例对象。
(3)apply调用模式:this指向apply传入的第一个对象。
(4)函数调用模式:this指向全局对象window(node中指向global)。
JavaScript 再认识(一):Function调用模式对this的影响的更多相关文章
- JavaScript的4种this调用模式
方法调用模式:函数调用模式:构造器调用模式:apply调用模式: 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象. 函数调用模式: ...
- javascript函数的四种调用模式及其this关键字的区别
方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象. //方法调用模式 var myObject = { value: 0 , incr ...
- javascript 函数的4种调用模式
1. 函数模式 // this 指向 window 全局对象 2. 方法模式 // this 指向调用这个方法的对象 3. 构造函数模式 // this 指向 new 新创建出来的实例 4. 上下文模 ...
- javascript函数调用中的方法调用模式
最近想起来之前看过的一种js语法,感觉很实用,但是又想不起来具体的写法.然后在网上浏览了一段时间,终于成功的再现了记忆中的那种语法,嗯~,还是那个熟悉的味道! 代码如下: <script> ...
- JavaScript函数的各种调用模式
函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同 ...
- js中this的四种调用模式
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 【转】JavaScript中的this关键字使用的四种调用模式
http://blog.csdn.net/itpinpai/article/details/51004266 this关键字本意:这个.这里的意思.在JavaScript中是指每一个方法或函数都会有一 ...
- JavaScript 方法调用模式和函数调用模式
这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为 ...
- JavaScript (JS) 函数补充 (含arguments、eval()、四种调用模式)
1. 程序异常 ① try-catch语法 测试异常 try-catch语法代码如下: try { 异常代码; try中可以承重异常代码, console.log(“try”) 出现异 ...
随机推荐
- CentOS 6.5下NFS安装配置
[root@local /]# yum -y install nfs-utils rpcbind3.创建共享目录:[root@local /]# mkdir /sharestore4.NFS共享文件路 ...
- loadrunner动态从mysql取值
loadrunner动态从mysql取值 [需要下载跟数据库服务器一致的dll,32位或64位] loadrunner中有参数化从数据库中取值,但是只是静态的,对于一些要实时取值的数据就game ov ...
- 自定义IHttpModule
HttpModule作用是 IIS将接收到的请求分发给相应的ISAPI处理前,先截获该请求. 通过这个我们可以完成很多额外功能. 自定义IHttpModule的例子: 通过自定义HttpModule, ...
- 微端游戏启动器launcher的制作之下载篇(系列一)
首先第一篇先讲一讲launcher最核心的功能---下载功能. 这个部分估计得好几篇才能写完,东西比较多也比较杂,慢慢来吧,我的东西也在继续改进中...... 从web上下载文件需要用到几个类,Htt ...
- 毕向东udp学习笔记1
参看了毕向东老师的视频教程,准备直接用EditPlus记事本来直接敲Java代码,好好学习一下udp部分,GUI部分,线程部分,加油 项目功能: 实现udp简单的发送接收功能. 当使用EditPlus ...
- 关于企业选取ERP软件的建议
笔者以前在广州的一家叫速达软件的公司从事实施维护的工作,该公司是一家专注于ERP软件的公司,主要做进销存与财务的管理软件. 期间也对于各大企业有过一些接触,看到很多公司在购买这款软件之后与这家公司发生 ...
- hadoop编译
说明: hadoop版本:hadoop-2.5.0-cdh5.3.6 环境:centos6.4 必须可联网 hadoop 下载网址: http://archive.cloudera.com/cdh5/ ...
- xcode8 更新cocoapods
一.升级ruby环境,由于目前淘宝Ruby镜像升级有问题,所以使用了 http://rubygems-china.oss.aliyuncs.com 二.需要操作的步骤: 1.检查你的ruby源,终端输 ...
- Codeforces Round #383 Div 1题解
第一次打Div 1,感觉还是挺难的..把基础题打完就日常划水了.... [A. Arpa's loud Owf and Mehrdad's evil plan](http://codeforces.c ...
- Kosaraju算法解析: 求解图的强连通分量
Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...