在JavaScript中另一个经常被误解的概念是this标识符。同样,在本系列的 this与对象原型 中有好几章关于它的内容,所以在这里我们只简要地介绍一下概念。

    虽然this可能经常看起来是与“面向对象模式”有关的,但在JS中this是一个不同的概念。

    如果一个函数在它内部拥有一个this引用,那么这个this引用通常指向一个object。但是指向哪一个object要看这个函数是如何被调用的。

    重要的是要理解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如何被设置有四个规则,它们被展示在这个代码段的最后四行中:

    1. foo()最终在非strict模式中将this设置为全局对象 —— 在strict模式中,this将会是undefined而且你会在访问bar属性时得到一个错误 —— 所以this.bar的值是global
    2. obj1.foo()this设置为对象obj1
    3. foo.call(obj2)this设置为对象obj2
    4. new foo()this设置为一个新的空对象。

    底线:要搞清楚this指向什么,你必须检视当前的函数是如何被调用的。它将是我们刚刚看到的四种中的一种,而这将会回答this是什么。

    注意: 关于this的更多信息,参见本系列的 this与对象原型 的第一和第二章。