试题一
var name = "222"
var a = {
name : "111",
say : function(){
console.log(this.name)
}
}
var fun = a.say;
fun()// 222 此行代码提取出来就为 function(){console.log(this.name)},没有对象调用,因此此时this指向为window
a.say()// 111 对象a调用其say()函数,此时this指向就位a,因此此时打印出来的就是为对象a下的属性
var b = {
name :"333",
say : function(fun){
fun()
}
}
b.say(a.say)// 222 此时将a.say,也就是函数作为实参传入到对象b内的say()函数,fun()在函数内部也是自己调用,没有对象调用,此时this仍然指向window
b.say = a.say
b.say()// 333 对象b调用say()函数,因此this指向b
试题二
var foo = "123"
function print(){
var foo = "456"
this.foo = "789"//此时并没有对象调用函数print(),所以这里更改的的windoe的GO里面的foo值
console.log(foo)// 456 此时打印的是自己AO里面的foo值!
}
print()
console.log(foo)// 789
试题三
var foo = "123"
function print(){
this.foo = "789" //没有对象调用print()函数,所以此时this指向为window,所以将window上GO里面的foo值更改成了 789
console.log(foo)// 789 此时由于函数自己的AO内没有foo 属性,所以往上,找全局GO里面的foo值,所以这里打印出来的就是789
}
print()