读书笔记(you don’t know js): this的理解(没写完…)

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理