JavaScript的this对初学者来说一直是一个很头疼的问题,因为它的指向刚刚接触的时候往往觉得有点莫名奇妙,这篇博客用实例来概括一下,this代表什么以及如何改变函数的this.

  在<JavaScript高级程序设计>一书中,对this做出了简单的介绍.即"this引用了函数据以执行的环境对象".如何理解这句话呢?先来看看第一个实例:

    function testFun1() {
var num = 3;
alert(this.num);
}
function testFun2() {
var num = 4;
testFun1();
}
testFun2();//undefined

  上面的代码输出undefined,从这个例子我们可以看出this是不会引用具体的某个函数对象的(虽然在JavaScript中,函数也是对象的一种).那么在上述情况下,this代表什么呢?可以在testFun1()中运行下面代码:

alert(this);

  输出的结果如下:

  可以得出如下结论:在直接调用函数的时候,this代指window对象!

  为了证明上述结论,可以使用下面例子验证:

    var num = 10;
function testFun1() {
var num = 3;
alert(this.num);
}
function testFun2() {
var num = 4;
testFun1();
}
testFun2();//

  接下来是第二个示例,我们将函数作为一个对象的属性:

    var num = 10;
function testFun1() {
var num = 3;
alert(this.num);
}
var o = new Object();
o.num = 2;
o.fun1 = testFun1;
o.fun1();//

  可以看出,当通过对象调用函数的时候(这个和Java中的对象调用方法倒挺类似的),则this指向这个对象.那么如果存在多层对象的嵌套呢?看看下面的例子:

   var num = 10;
var inObj = new Object();
var outObj = new Object();
outObj.innerObj = inObj;
outObj.num = 10;
inObj.num = 5;
inObj.infun = testFun1;
function testFun1() {
alert(this.num);//
}
outObj.innerObj.infun();

  从上面的例子看出来,当存在多层对象的嵌套的时候,则this指向离函数"最近"的对象.

  讨论完this之后,我们在讨论下如何改变函数中的this.下面的示例演示了两种改变this的方式:

    var num = 3;
function print() {
alert(this.num);
}
var obj = {"num":10};
print.call(window);//
print.call(obj);//
print.call();//
var objPrint = print.bind(obj);
var windowPrint = print.bind(window);
objPrint();//
windowPrint();//

  call方法代表执行函数,传入的第一个参数代指函数的执行环境,因此在传入window,则通过call方法执行函数的时候.this指向window.传入对象的时候,this指向该对象.

  bind方法则将该函数绑定一个执行环境,并且返回绑定该执行环境的函数对象.可以直接调用.

浅谈JavaSript中的this的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  3. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  4. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  5. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  6. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  7. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  8. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  9. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

随机推荐

  1. Mac下FTP的使用

    高版本的mac os默认关掉了FTP服务,打开“终端”之后,可用如下命令打开: sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp. ...

  2. linux 文件夹和文件操作

    1.统计目录有多少个文件数 find ./company -type f | wc -l 2.删除文件夹中的文件 rm -f * #最经典的方法,删除当前目录下的所有类型的文件 rsync --del ...

  3. opencv---JPEG图像质量检测代码

    参考:http://blog.csdn.net/trent1985/article/details/50904173 根据国外一篇大牛的文章:No-Reference Perceptual Quali ...

  4. odoo 打印格式中 打印第一个数据默认

    <table style="width:100%;"> <tr> <td style="word-wrap:break-word;width ...

  5. python 字典,元组,对象,数组取值方法

    def create(self,cr,uid,vals,context=None): if context is None: context ={} if vals.get('name','/')== ...

  6. 【js】某字符串多次替换

    eg:  var str="icon icon-1chkedchkedchked"; var strNew=str.replace(new RegExp("chked&q ...

  7. 20155334 《网络攻防》Exp4 恶意代码分析

    <网络攻防>Exp4 恶意代码分析 一.实验问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监 ...

  8. 【WPF】数据验证

    原文:[WPF]数据验证 引言      数据验证在任何用户界面程序中都是不可缺少的一部分.在WPF中,数据验证更是和绑定紧紧联系在一起,下面简单介绍MVVM模式下常用的几种验证方式. 错误信息显示 ...

  9. 备忘:BLOCK CORRUPTION IN SYSTEM DATAFILE

    http://www.onlinedbasupport.com/2010/12/10/block-corruption-in-system-datafile/

  10. 汇编 REPNE/REPNZ指令,SCASW指令,SCASD指令,SCAS指令

    知识点: REPNE/REPNZ 指令 SCASW 指令 SCASD 指令 SCAS 指令 一.SCASW 指令 //SCASB cmp word ptr [edi],al //对标志位的影响 ...