今天在复习闭包的相关知识的时候 发现自己对this的理解有不小的偏差 所以找来这篇(也有Chinese Edition啦)看一看 这篇blog就作为”this”的笔记吧 算是一边学一边翻译啦

JavaScript中this总是指向正在执行的函数的所有者,或者指向将这个函数作为方法来调用的对象。我们在当前页面定义了doSomething(),那么doSomething()的所有者就是当前的页面,或者说是JavaScript的window对象(global object)。

function doSomething() {
   this.style.color = '#c00';
}

传统事件注册

这个函数是直接定义在js中的,如果以function()的方式直接调用doSomething(),那么this就是指window,由于window没有style.color这个属性,call的结果就是报错。如果是以element.onclick = doSomething()的方式调用doSomething(),那么this指的就是指element,此时doSomething()会产生一个copy,element实际上调用的是这个copy,原始的doSomething()在内存中,并没有被调用。这样以后可以有很多的elements来call doSomething(),就会产生copies。每次调用的时候this都是指向当前调用它的元素。

行内事件注册

如下就是行内事件注册,html和js没有分离,这就不是对doSomething()的copy,而是直接指向doSomething()这个函数,即调用了这个函数,而没有实际等于这个函数。它的意思就是“到doSomething()中去执行它”,所以实际上执行的doSomething()函数就是原始的函数,所以this在这里指的就是window。

  1. 以下的this指向element/ copy了doSomething()

    element.onclick = doSomething()
    element.addEventListener('click',doSomething,false)
    element.onclick = function () {this.style.color = '#cc0000';}
    <element onclick="this.style.color = '#cc0000';">
    <element onclick="doSomething(this)">
    function doSomething(obj) {
       obj.style.color = '#cc0000';
    }
    
  2. 以下的this指向window

    element.onclick = function () {doSomething()}
    element.attachEvent('onclick',doSomething)
    <element onclick="doSomething()">