javascript有this关键字,它和javascript的执行上下文有着密切的关系,就是说this具体指代什么要根据它的上下文来判断。

一、this和对象的关系   

var Person={
name:"xie yue",
gender:"female",
getName:function(){
alert(Person.name);
}
};
Person.getName();

上面的代码中,我们定义了一个Person对象,对象中包含了name,gender属性和getName方法,其作用是弹出Person对象的name属性。在这种情况下我们使用this关键字代替Person对象本身,所以上面的代码就等于:

var Person={
name:"xie yue",
gender:"female",
getName:function(){
alert(this.name);
}
};
Person.getName();

PS:this永远指向的是函数对象的所有者,上面例子中getName的所有者是Person对象,所以this指向的是Person对象。

二、this和全局对象

我们再来看看在全局对象中,this指代的是什么,我们知道javascript是脚本语言,所以javascript的执行需要一个宿主环境,在浏览器中这个宿主就是window对象,所以在全局函数中this指代的是window对象(除非使用了new、apply、call方法来改变this的指代关系)。

var a=2;
alert(a);//
alert(this.a);//
alert(window.a);//

我们经常在函数名字前面加上window来调用函数,这是因为在浏览器中的全局对象就是window,所有的函数变量都在window对象之中。比如:

var a=2;
function foo(){
var b=3;
return(this.a+b);//这里的this指代window,返回3
}
foo();

所以记住:this永远指向函数对象的所有者,即this的值是由激活执行上下文代码的调用者决定的,就好理解this的指代关系了。

三、构造函数中的this

当函数作为构造器使用new实例化时,this的指代关系又是怎么样的呢?看下面的代码:

var Person=function(){
this.name="xiyue";
}
var person = new Person();
alert(person.name);

这个执行过程可以分成3步:

1、首先建立一个空对象object,如var obj={};

2、然后将空对象使用Person的call操作,类似Person.call(obj);

3、执行完Person后再return this,完成new过程,赋值给person变量。

所以经过new加工过函数,this的函数调用者是Person本身而不是window对象了。

四、嵌套函数中的this

在嵌套函数中,this的指代对象又会是怎么样呢?看下面的代码:

var myObj={
fun1:function(){
alert(this);//object
var fun2=function(){
alert(this);//window
var fun3=function(){
alert(this);//window
}()
}()
}
};
myObj.fun1();

由于嵌套函数的执行上下文是window,所以this指代的是window对象。

五、事件处理中的this

在javascript中处理事件函数中,this指代的关系就更加扑朔迷离了,我们建立一个showValue的函数,函数内容如下:

var showValue=function(){
alert(this.value);
}

现在有个input标签,我们给input标签添加一个click事件,当点击click事件是触发showValue函数,看看现在的this指代的是什么?

<input id="test" type="text" />

通过dom.onclick绑定事件:document.getElementById("test").onclick=showValue;这里的showValue虽然定义在全局对象中,但是采用了onclick的绑定方式时,showValue是作为dom的onclick方法被调用的,所以this指代的是dom对象而不再是window对象啦!

六、当事件写在html标签内

<input id="test" type="text" onclick="showValue();" />

当点击dom时,我们获取不到正确的this。因为此时的this指代的是window对象,因为window对象没有定义value的值,所以会弹出undefined,因为没有获取到value的值,其实此时不是将showValue函数赋值给dom对象的onclick,而是引用!所以上面的代码与下面的代码是一样的。

document.getElementById("test").onclick=function(){
showValue();
}

根据上面所说的javascript中的嵌套函数this其实是指代的window对象,所以showValue的this其实就是window对象。

七、通过addEventListener和attachEvent绑定事件监听

<input type="text" id="test" />
<script>
var dom = document.getElementById("test");
id="window";
function test(){
alert(this.id);
}
dom.addEventListener?dom.addEventListener("click",test,false):dom.attachEvent("onclick",test);
</script>

这种绑定事件的监听方式,addEventListener中的this指代的dom对象,而attachEvent中的this指代的则是window对象(**星星**);

八、使用apply和call改变this的指向

在Function对象原型中(Function.prototype)有两个方法:call和apply,通过call和apply可以改变this的值,它们都接受第一个参数作为调用执行上下文中this的值,它们的不同点是:从第二个参数开始,apply接收参数为数组,而call接收的参数则是依次传入的。

var obj={
name:"xiyue",
gender:"female"
};
var getInfo=function(){
return{"name"+this.name,"gender"+this.gender};
}
getInfo.call(obj);

当没有getInfo.call(obj)时,getInfo中的this指代的是window对象,但是有了getInfo.call(obj)代码时,函数的执行环境就不一样了,因为此时函数体内的this对象指向了obj啦,所以就会返回obj中的属性。
总结:this是javascript中的重要关键字,只有掌握了this在不同的执行上下文所指代的关系,才能避免一些不必要的错误。

正确理解javascript的this关键字的更多相关文章

  1. 深入理解Javascript之this关键字

    深入理解Javascript之this关键字 作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/09/08/1076.html 转载请注明出处 ...

  2. 正确理解JavaScript中的this关键字

    JavaScript有this关键字,this跟JavaScript的执行上下文密切相关,很多前端开发工程师至今对this关键字还是模棱两可,本文将结合代码讲解下JavaScript的this关键字. ...

  3. 正确理解javascript当中的面向对象

    认识面向对象: 为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念: 1.万物皆为空:万物皆对象 2.对象具有封装和继承特性 ...

  4. 理解JavaScript里this关键字

    1.全局代码中的this:始终指向window 2.函数代码中的this: }; var bar = { x: , test: function () { alert(this === bar); a ...

  5. 如何正确理解javascript的模块化的

  6. 如何理解JavaScript中的this关键字

    前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...

  7. 转载 深入理解JavaScript中的this关键字

    转载原地址: http://www.cnblogs.com/rainman/archive/2009/05/03/1448392.html 深入理解JavaScript中的this关键字   1. 一 ...

  8. 理解JavaScript中的this关键字

    JavaScript中this关键字理解 在爬虫的过程中遇到了前端的js代码,对于this关键字理解的不是很清楚,所以写下这篇笔记,不足之处,希望得以改之. this的指向在函数定义的时候无法确定,只 ...

  9. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

随机推荐

  1. Hdu 5001 Walk 概率dp

    Walk Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5001 Desc ...

  2. 12.1 文档相关 Webbrowser 该文档已被修改,是否保存修改结果

       附件:http://files.cnblogs.com/xe2011/Webbrowser_Document_IsModified.rar   该文档已被修改,是否保存修改结果?是:保存修改结果 ...

  3. SQL书写技巧

    SQL书写技巧: 1.针对分区表,如果可以使用分区条件的,一定要加分区条件.分区条件的使用,可以减少不必要的数据访问,加快查询数据,如TB_CSV_ACCEPT_FLOW_OPERATOR表,以acc ...

  4. Sublime Text 3 史上最性感的编辑器

    下载 / 安装 windows / MAC OS 官网下载,双击安装,这个都会吧- linux linux下安装,一种办法是从官网下载 tar.bz ,手动安装. 这里介绍用 apt-get 自己主动 ...

  5. 信号之alarm和pause函数

    使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...

  6. JavaScript网站设计实践(六)编写live.html页面 改进表格显示

    一.编写live.html页面,1.JavaScript实现表格的隔行换色,并且当鼠标移过时当前行高亮显示:2.是输出表格中的abbr标签的内容 实现后的效果图是这样的: 1.实现思路 在输出表格的时 ...

  7. php安装ecshop

    1.apache2.2正常 2.源码htdoc下面保存不动 3.E:\PHP 安装目录下 php5.3.28 就不支持jpeg php5.2.17 就不支持 mysql 说明就是php的问题,因为其他 ...

  8. rsync配置

    一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...

  9. nginx配置文件特殊字符说明

    开发过程中经常重复配置nginx.conf,对里面的特殊字符始终不太明白具体的意义,今天百度nginx配置看到一篇不错的文章,转载记录下来,以备不时之需. nginx rewrite 正则表达式匹配 ...

  10. 关于Git远程版本库

    Git作为分布式版本库控制系统,每个人都是本地版本库的主人,可以在本地的版本库中随心所欲的创建分支和里程碑. 当需要多人协作时,问题就出现了: 1.如何避免因为用户把所有的本地分支都推送到了共享版本库 ...