1 看题
var obj = {
age: 18,
foo: function (func) {
func()
arguments[0]()
}
}
var age = 10
function temp () { console.log(this.age)}
obj.foo(temp)
// 10 undefined
- 这里我们是用arguments0这样的形式调用它,它里面的this指向的就不是window而是arguments本身了
2 价加强一下
var obj = {
age: 10,
foo: function (fn) {
fn.call(this)()
arguments[0]()()
arguments[0].call(this)()
arguments[0]().call(this)
}
}
var age = 20
function temp () {
return function () {
console.log(this.age)
}
}
obj.foo(temp)
3 解析
- fn.call(this)()是最简单的了,看过呆呆this那篇文章的小伙伴应该都知道,fn.call(this)()使用.call(this)改变的是temp第一层函数中的this,但是最终调用那个匿名函数的还是window,所以会打印出20。
- arguments0(),通过上面👆的正题我们知道arguments0中,也就是temp函数的第一层指向的是arguments对象,而调用temp返回的那个匿名函数的也还是window,就像是fn.call(this)()一样,所以打印出的也还是20。(做这类题你就想着一个函数中返回另一个函数,如果没用call/apply进行显式绑定的话,调用它的都是window)
- arguments[0].call(this)()和第二个一样,它使用.call(this)改变的是temp函数的第一层this指向,而调用匿名函数的也还是window,因此还是打印出20。
- arguments0.call(this),这里使用.call(this)改变的就是匿名函数内的this指向了,将它绑定为foo函数内的this,而我们知道,此时foo函数内的this是指向的obj,因为调用fs oo的是obj,所以会打印出10。