关于this
    虽然this一般与“面向对象的模式相关”,但与javascript的this则是另外一种机制。
    如果一个函数内部有一个this引用,那么这个this通常指向一个对象。但他指向的是哪个对象要根据这个函数是如何被调用起来决定。
    this并不指向这个函数本身,意识到这一点非常重要,因为这是非常常见的误解。
    以下是个简单的说明

    1. function foo() {
    2. console.log(this.bar)
    3. }
    4. var bar = "global"
    5. var obj1 = {
    6. bar: "obj1",
    7. foo: foo
    8. }
    9. var obj2 = {
    10. bar: "obj2"
    11. }
    12. // -----
    13. foo(); // "global"
    14. obj1.foo(); // "obj1"
    15. foo.call(obj2); // "obj2"
    16. new foo(); // undefined

    关于如何设置this有四条规则,上述代码的最后4行展示了这4条规则。
    (1)在非严格模式下,foo()最后会将this设置为全局对象。在严格模式下,这是未定义的行为,在访问bar属性时会出错——因此“global”是为this.bar创建的值。
    (2)obj1.foo()将this设置为对象obj1.
    (3) foo.call(obj2)将this设置为对象obj2.
    (4) new foo() 将this设置为一个全新的空对象。
    底线:为了搞清楚this指向什么,你必须检查相关的函数是如何被调用的。