在js中this不像其它语言那样容易理解,它有时候指window对象,有时候又是其它对象,那么this,你到底是谁呢?
要分析this就要先理解js中的方法定义,因为this一般都是在方法中使用的,而且方法在js中的地位又很特殊。

在js中定义的方法一定不会单独存在,它必定属于某个对象,所以this就是代表方法属于的那个对象。

1、一般方法

function test() {
alert(this==window);
}
test();

像这种普通的方法定义,方法并没有属于某个对象呀?其实js里有个全局的window对象,没错,这个方法就是定义在window对象下了,所以里面的this肯定就是window。

2、方法,还是方法

function test1(){

    function test2(){
alert(this==window)
}
test2()
}
test1();

这种情况呢,test2没有明显的属于某个对象,那它就...对,那它就属于window对象,所以里面的this就是指window对象。

3、对象的方法

var o={
test:function(){
alert(this==window);
}
}
o.test();

这种情况就很容易理解了,test方法属于o对象,this当然是指o对象了。

4、再见对象

function Persion () {
this.name="mu";
} Persion.prototype.show=function(){
alert(this.name);
} var p=new Persion(); p.show();

再来看Persion方法,这里的Persion是构造函数,所以this就是指new的时候js创建的匿名对象,这个匿名对象又赋给了p对象,于是this就是指p对象。

5、别忘了事件

var btn=document.getElementById("btn");
btn.onclick=function(){
alert(this);
}

onclick方法属于btn对象,所以this指向btn

btn.addEventListener("click",function(){
alert(this);
}) btn.attachEvent("onclick",function(){
alert(this);
});

这里比较特殊了,前者是W3C标准的,this指向btn,后者是ie专有的,this指定window,这里只能死记了。


最后总结一句话:this代表谁,就看方法属于谁,ie事件绑定指window对象!

随机推荐

  1. 《Java程序猿面试笔试宝典》之 什么是AOP

    AOP(Aspect-Oriented Programming.面向切面编程)是对面向对象开发的一种补充,它同意开发者在不改变原来模型的基础上动态地改动模型从而满足新的需求.比如.在不改变原来业务逻辑 ...

  2. ES6 const用法

    1.const声明一个只读的常量.一旦声明,常量的值就不能改变. 2.const的作用域与let命令相同:只在声明所在的块级作用域内有效. 3.const命令声明的常量也是不提升,只能在声明的位置后面 ...

  3. Python进阶---python strip() split()函数实战(转)

    先看一个例子: >>> ipaddr = 10.122.19.10 File "", line 1 ipaddr = 10.122.19.10 ^ SyntaxE ...

  4. No suitable driver found for jdbc:mysql://localhost:3306/hibernate_basic

    Struts Problem Report Struts has detected an unhandled exception: Messages: No suitable driver found ...

  5. DataTable转换成匿名类的List类型

    DataTable转换成匿名类的List类型   因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ...

  6. HTTP 状态码总结 (HTTP Status Codes)

    今天与同事聊天中提及到HTTP状态码的问题,突然发现工作这么些年对这个天天打交道的东西也没有一个详细的了解.日常最常见的状态码莫过于500和404了,几乎从事IT的应该都知道或许不从事的都知道,呵呵! ...

  7. 堆越界--coredump 在malloc函数里

    一,可执行程序分析: objdump -h xxx,可以看到程序内部各个段的内存分布,结果如下(部分):  26 .data         0000016c  0000000000879d20  0 ...

  8. LinkedList的一种错误使用方法

    近期在做图像处理的时候.发现某一段代码很的慢.慢得让人无法接受.基本的代码是顺序訪问一个LinkedList的元素,效果是随着index的变大,速度越来越慢,list的元素个数在百万以上.找到原因,分 ...

  9. PHP保留2位小数、格式化小数、浮点数

    JS保留两位小数例子 四舍五入使用函数 toFixed() [javascript] <html> <head> </head> <script> va ...

  10. LNMP架构二

    Nginx默认虚拟主机 1.首先修改nginx.conf文件,删除server及下面的,在http最后添加include vhost/*.conf; (指定虚拟主机目录,并读取以.conf结尾的文件) ...