关于this
虽然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(); // "global"
obj1.foo(); // "obj1"
foo.call(obj2); // "obj2"
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指向什么,你必须检查相关的函数是如何被调用的。