题目:
var name = 222
var a = {
name: 111,
say: function () {
console.log(this.name)
}
}
var fun = a.say
fun()
a.say()
var b = {
name: 333,
say: function (fun) {
fun()
}
}
b.say(a.say)
b.say = a.say
b.say()
分析:
在函数调用时,若直接调用,则其内部this则指向window,事实上:
fun (name) {
console.log(name)
}
fun('张三')//此函数调用可等于下列代码
fun.call(window,'张三')
即函数即对象,对象必有方法可以调用,而直接调用,则调用者即window,若函数作为对象的方法被调用,则谁调用的,this就指向谁,例如:
name: '李四'
var person = {
name: '张三'
say:function () {
console.log(this.name)
}
}
person.say()//say函数被person对象调用,即this指向person,也可以等价于下列代码
person.say.call(person)
本题分析:
1.首先从上往下浏览代码,接着找出每一个函数调用,即一共四个函数调用:
fun()
a.say()
b.say(a.say)
b.say()
2.判度这些函数调用是直接调用还是对象调用,从外
var name = 222
var a = {
name: 111,
say: function () {
console.log(this.name)
}
}
var fun = a.say
fun()//相当于fun.call(window)//故this指向window,故输出222
a.say()//相当于a.say.call(a)//this指向a,故输出111
var b = {
name: 333,
say: function (fun) {
fun()
}
}
b.say(a.say)
/*形参为函数的,则找出形参函数的调用方式,
该处形参的调用方式为直接调用,则this指向window,
接着找实参函数,因为输出this.name,this又指向window,故
输出222*/
b.say = a.say//函数赋值
b.say()
//相当于b.say.call(b),this指向b,故输出b作用域中的name:333