this的迷之指向
var obj = {
foo:function(){console.log(this)
}
}var bar = obj.foo
obj.foo()// 打印出的 this 是 objbar()// 打印出的 this 是 window请解释最后两行函数的值为什么不一样。
//ES5函数调用的3种形式
func(p1, p2)
obj.child.method(p1, p2)
func.call(context, p1, p2)
//语法糖
func(p1, p2) 等价于
func.call(undefined, p1, p2)
obj.child.method(p1, p2) 等价于
obj.child.method.call(obj.child, p1, p2)
//第三种func.call(context, p1, p2)//this,就是上面代码中的 context。
functionfunc(){
console.log(this)
}func()//等价于functionfunc(){
console.log(this)
}func.call(undefined)// 可以简写为 func.call()//上面是打印出来是什么?
按理说打印出来的 this 应该就是 undefined 了吧,但浏览器里有一条规则: 如果你传的 context 就 null 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined) 因此上面的打印结果是 window。
//如果你希望这里的 this 不是 window,很简单:func.call(obj)// 那么里面的 this 就是 obj 对象了
obj.child.method(p1, p2) 的 this 如何确定varobj = {
foo: function(){
console.log(this)
}
}
obj.foo()
按照「转换代码」,我们将 obj.foo() 转换为
obj.foo.call(obj)
好了,this 就是 obj。搞定。
回到题目varobj = {
foo:function(){console.log(this)
}
}varbar = obj.foo
obj.foo()// 转换为 obj.foo.call(obj),this 就是 objbar()// 转换为 bar.call()// 由于没有传 context// 所以 this 就是 undefined// 最后浏览器给你一个默认的 this —— window 对象