在JavaScript中另一个经常被误解的概念是this
标识符。同样,在本系列的 this与对象原型 中有好几章关于它的内容,所以在这里我们只简要地介绍一下概念。
虽然this
可能经常看起来是与“面向对象模式”有关的,但在JS中this
是一个不同的概念。
如果一个函数在它内部拥有一个this
引用,那么这个this
引用通常指向一个object
。但是指向哪一个object
要看这个函数是如何被调用的。
重要的是要理解this
不是 指函数本身,这是最常见的误解。
这是一个快速的说明:
function foo() {
console.log( this.bar );
}
var bar = "global";
var obj1 = {
bar: "obj1",
foo: foo
};
var obj2 = {
bar: "obj2"
};
// --------
foo(); // "global"
obj1.foo(); // "obj1"
foo.call( obj2 ); // "obj2"
new foo(); // undefined
关于this
如何被设置有四个规则,它们被展示在这个代码段的最后四行中:
foo()
最终在非strict模式中将this
设置为全局对象 —— 在strict模式中,this
将会是undefined
而且你会在访问bar
属性时得到一个错误 —— 所以this.bar
的值是global
。obj1.foo()
将this
设置为对象obj1
。foo.call(obj2)
将this
设置为对象obj2
。new foo()
将this
设置为一个新的空对象。
底线:要搞清楚this
指向什么,你必须检视当前的函数是如何被调用的。它将是我们刚刚看到的四种中的一种,而这将会回答this
是什么。
注意: 关于this
的更多信息,参见本系列的 this与对象原型 的第一和第二章。