- 你不知道的JavaScript(下卷)
- (美)凯尔·辛普森
- 491字
- 2020-08-29 01:58:06
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(上卷)》第二部分中的前两章。