结论
先说结论:在不使用箭头函数和修改this指向时,this默认指向最终调用它的对象。
例子
function a() {
console.log(this);
}
a(); // window对象
上面的代码相当于:function a() {
console.log(this);
}
window.a(); // window对象
this的执行,是由window对象的a方法调用的,所以this指向window
var a = {
'print': function () {
console.log(this);
}
}
a.print(); // a对象
window.a.print(); // a对象
this是由a对象的print方法调用的,a对象虽然属于window对象,但this指向最终调用它的对象,所以this指向a。
var a = {
'b': {
'print': function() {
console.log(this);
}
}
}
a.b.print(); // b对象
这个就不说了。
function b() {
console.log(this);
}
var a = {
print: function () {
b(); // 此处相当于window.b();
},
print1: function () {
return b;
}
}
a.print(); // window对象
a.print1()(); // window对象
这个例子中,a对象只是调用的print方法,最终调用this的是window对象的b方法。
function b() {
console.log(this);
}
var a = {
'print': b
}
a.print(); // a对象
这个例子中,将b方法给了a对象的print方法,所以this是由a.print方法调用的。
可以看成下面的例子:
var a = {
'print': function b() {
console.log(this);
}
}
a.print(); // a对象
这样就比较好理解了。
var a = {
'print': function () {
console.log(this);
}
}
var b = a.print;
b(); // window对象
a.print只是一个函数,这个函数赋给b,再由b执行,而b属于window对象,最终调用this的就成window对象了。
自执行函数的this指向问题
var a = {
'print': function() {
console.log(this); // a对象
(function () {
console.log(this); // window对象
}()) ;
}
}
a.print();
在自执行函数中this指向window对象。
定时器函数this指向
var a = {
'print': function () {
setTimeout(function() {
console.log(this);
}, 500);
}
}
a.print(); // window对象
setTimeout & setInterval 中,延后执行的内容,this指向window。
new关键字this指向
function A() {
this.print = function () {
console.log(this);
}
}
var a = new A();
a.print(); // a对象
new关键字会创建一个空的对象,然后会自动调用一个函数call方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
通过new关键字创建的对象,若构造函数有返回值,且返回值为对象,则创建的对象为返回值,返回值不为对象,创建的对象为构造的对象,更多请看new关键字。
严格模式中默认this不在指向window,而是undefined。
想要改变this指向:bind&call&apply