首先,函数不能存储this的值,this指向哪里,取决于调用它的对象。若是没有这个对象,那默认就是window调用(非严格模式下)。也就是说this是在运行的时候定义的,不是在绑定的时候定义的。函数
function foo(num) { console.log("foo: " + num); this.count++ } foo.count = 0; for(var i = 0; i < 10; i++) { foo(i); } console.log(foo.count) //输出是0,由于调 console.log(window.count) // 输出是NAN, 由于window.count没有初始值
再贴一段代码oop
function foo() { var a = 2; this.bar(); } function bar() { console.log( this.a ); } window.a = 3; foo();//输出3,这个时候,是window.foo,由于bar也是由window调用
先看一个例子this
function foo() { console.log(this.a) } var obj = { foo: foo, a: 2 } var bar = obj.foo();// 函数别名 var a = "opps, global"; obj.foo();// 输出2 bar();// 输出opps, global,调用bar的是window
这个状况比较容易致使咱们在传回调函数的时候,出现this指向问题code
function foo() { console.log(this.a); } function doFoo(fn) { fn(); } var obj = { a: 2, foo: foo } var a = "oops, global"; doFoo(obj.foo); // 传递了一个函数过去,这个函数由window调用,因此最后输出的是"opps, global"
固然咱们能够很简单地用一个bind来解决问题对象
doFoo(obj.foo.bind(obj)