var obj = {
show : function(){
console.log(this);
}
}
obj.show(); // this指向obj本身
function show(){
console.log(this);
}
show(); // 等同于window.show() // this指向window
btn.onclick = function(){
console.log(this);
}
btn.onclick(); //手动调用函数
// 除手动调用外,鼠标单击按钮也可以触发函数执行
// 不论是手动还是点击,this都指向btn对象
即:
对象.函数();
那么,函数里的this,必然指向这个对象本身!
function show(){
console.log(this);
}
window.show(); //打印window对象
var obj1 = {};
obj1.show1 = show;
obj1.show1(); //打印obj1对象
var obj2 = {};
obj2.show2 = obj1.show1;
obj2.show2(); //打印obj2对象
btn.onclick = function(){ //<----这个函数,用A来表示
setTimeout(function(){ //<----这个函数,用B来表示
console.log(this);
},0)
}
btn.onclick(); // 实际的打印结果,是 window对象
// this指向会依赖它所在的函数
// 而这个函数,到底是 函数A还是函数B呢?
// 其实你不难从代码中看的出来, this很明显是在函数B中的
// 所以, 结果没有打印出 btn, 现在我们也不感到奇怪了
// 因为, this已经不在函数A的内部了,而是函数B的内部
// 你可能还要问,为什么函数B里的 this指向window呢?
// 这里其实算是一个特例,传入定时器的函数,由哪个对象调用,我们不得而知
// 这种情况,this就指向window
function fn(){
console.log(this);
}
var obj = {
show: fn
}
btn.onclick = function(){
window.setTimeout(function(){
obj.show(); // 打印的是obj对象
}, 100);
}
function m1(){
function m2(){
console.log(this);
}
m2();
}
m1();
// 我们不禁要问,函数m2是由哪个对象调用的?
// 我们想尽了各种可能,最终发现都是错的。
// 我们始终不知道这个m2由哪个对象调用,好像它就那样执行了
// 而实际的打印结果呢?
// 不出意外,还是window对象
最后的结论
- 所有的this关键字,在函数运行时,才能确定它的指向
- this所在的函数由哪个对象调用,this就会指向谁
- 当函数执行时,没有明确的调用对象时,则this指向window
头函数可以用call来改变this指向吗?
不能!! 试图改变箭头函数的this是徒劳的。
var fn = () => {
console.log(this)
}
fn.call(document) // 依旧是window对象
特例:构造函数
注意,在构造函数中,上面我们所讲的结论,是不成立的
林秀栋的技术博客