this 关键字是 JavaScript 中最复杂的机制之一。 它是一个很特别的关键字, 被自动定义在所有函数的作用域中。
function identify() {
return this.name.toUpperCase();
}
function speak() {
var greeting = "Hello, 我是" + identify.call( this );
console.log( greeting );
}
var me = {
name: "ben"
};
var you = {
name: "233"
};
console.log(identify.call( me )); //ben
console.log(identify.call( you )); // 233
speak.call( me ); // Hello, 我是 ben
speak.call( you ); // Hello, 我是 233
上面这段代码可以在不同的上下文对象(me 和 you) 中重复使用函数 identify() 和 speak(),不用针对每个对象编写不同版本的函数。如果不使用 this, 那就需要给 identify() 和 speak() 显式传入一个上下文对象。
function identify(context) {
return context.name.toUpperCase();
}
function speak(context) {
var greeting = "Hello, 我是 " + identify( context );
console.log( greeting );
} i
dentify( you ); // 233
speak( me ); //hello, 我是 ben`
然而, this 提供了一种更优雅的方式来隐式“传递” 一个对象引用, 因此可以将 API 设计
得更加简洁并且易于复用。
this的指向问题
首先this并不指向自己,以下代码可以得出结论
function foo(num) {
console.log( "foo: " + num );
// 记录 foo 被调用的次数
this.count++;
} f
oo.count = 0;
var i;
for (i=0; i<10; i++) {
if (i > 5) {
foo( i );
}
} /
/ foo: 6
// foo: 7
// foo: 8
// foo: 9
// foo 被调用了多少次?
console.log( foo.count ); // 0
console.log 语句产生了 4 条输出, 证明 foo(…) 确实被调用了 4 次, 但是 foo.count 仍然
是 0。 显然从this并不指向自己。
当一个函数被调用时, 会创建一个活动记录(有时候也称为执行上下文)。 这个记录会包
含函数在哪里被调用(调用栈)、 函数的调用方法、 传入的参数等信息。 this 就是记录的
其中一个属性, 会在函数执行的过程中用到。–来自资料
根据上面的一段话我们可以知道,this 实际上是在函数被调用时发生的绑定, 它指向什么完全取决于函数在哪里被调用。