基本概念首先,函数不能存储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没有初始值再贴一段代码 function foo() { var a = 2; this.bar(); } function bar() { console.log( this.a ); } window.a = 3; foo();//输出3,这个时候,是window.foo,因为bar也是由window调用隐式绑定的问题先看一个例子 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指向问题 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) 显示绑定(未完待续)