var name = "Window";
var oPerson = {
name:"Bob",
friend:{
name:"Jonh",
sayHi:function(){
alert(this.name);
}
}
};
var sayHi = oPerson.friend.sayHi;
sayHi(); //"Window"
var name = "Window";
var oPerson = {
name:"Bob",
friend:{
name:"Jonh",
sayHi:function(){
alert(this.name);
}
}
};
var sayHi = oPerson.friend.sayHi;
sayHi(); //"Window"
var name = "Window";
var oPerson = {
name:"Bob",
friend:{
name:"Jonh",
sayHi:function(){
alert(this.name);
}
}
};
var sayHi = oPerson.friend.sayHi.call(oPerson);
var sayHi = oPerson.friend.sayHi.call(oPerson.friend);
这里跟调用位置有关系。
第一如果是通过对象来调用。
比如oPerson.friend.sayHi() 那么this就会指向 oPerson的作用域。
第二如果赋值后调用
var sayHi = oPerson.friend.sayHi;
此时,sayHi变量直接引用sayHi函数体。调用sayHi()时,此处的作用域是windows.
这里
var sayHi = oPerson.friend.sayHi;
其实只赋值了函数式.
整段js就相当于你只写了:
var name = "Window";
function(){
alert(this.name);
}
所以会得到"Window".
可以阅读一些js关于函数式编程的资料,你就明白了
var name = "Window";
var oPerson = {
name:"Bob",
friend:{
name:"Jonh",
sayHi:function(){
alert(this.name);
}
}
};
var sayHi = oPerson.friend.sayHi.call(oPerson.friend);//直接输出John
var sayHi = oPerson.friend.sayHi.bind(oPerson.friend);
sayHi();//Jonh
sayHi() = window.sayHi() = sayHi.apply(window)
实际上javascript调用方法a.func(函数)都等价于 func.apply(a),当然前提是要a有func这个属性或者a的原型链上有func属性(即可以获取到函数引用)。
如果省去a的话,就相当于func.apply(null)也就是func.apply(window)
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
道理和上面一样, 你的 function this 并没有特殊指向, 所以默认指向了 window.