2.6 this标识符

JavaScript中另一个被普遍误解的概念是this关键字。同样地,本系列《你不知道的JavaScript(上卷)》第二部分中有几章内容是专门介绍这一技术的,因此,这里只是简单地介绍一下概念。

虽然this一般与“面向对象的模式”相关,但JavaScript中的this则是另外一种机制。如果一个函数内部有一个this引用,那么这个this通常指向一个对象。但它指向的是哪个对象要根据这个函数是如何被调用来决定。

this并不指向这个函数本身,意识到这一点非常重要,因为这是最常见的误解。

以下是一个简单的说明:

        function foo() {
            console.log( this.bar );
        }


        var bar = "global";


        var obj1 = {
            bar: "obj1",
            foo: foo
        };


        var obj2 = {
            bar: "obj2"
        };


        // --------


        foo();             // “全局的”
        obj1.foo();        // "obj1"
        foo.call( obj2 );  // "obj2"
        new foo();         // undefined

关于如何设置this有4条规则,上述代码中的最后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指向什么,你必须检查相关的函数是如何被调用的。调用方式会是以上4种之一,这也会回答“this是什么”这个问题。

有关this的更多信息,参见本系列《你不知道的JavaScript(上卷)》第二部分中的前两章。