指向自身
使用foo标识符替代this来引用函数对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function foo(num) { console.log( "foo: " + num ); // 记录foo被调用的次数 foo.count++; } foo.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 ); // 4
|
然而,这种方法同样回避了this的问题,并且完全依赖于变量foo的词法作用域。
另一种方法是强制this指向foo函数对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function foo(num) { console.log( "foo: " + num ); // 记录foo被调用的次数 // 注意,在当前的调用方式下(参见下方代码),this确实指向foo this.count++; } foo.count = 0; var i; for (i=0; i<10; i++) { if (i > 5) { // 使用call(..)可以确保this指向函数对象foo本身 foo.call( foo, i ); } } // foo: 6 // foo: 7 // foo: 8 // foo: 9 // foo被调用了多少次? console.log( foo.count ); // 4
|
this到底是什么
this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时
的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在
哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的其中一个属性,会在
函数执行的过程中用到。
this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。