基本概念
首先,函数不能存储 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)
显示绑定(未完待续)