理解javascript中this的指向
正常情况下,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();
}
}
a.print(); // 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对象。
var a = {
'print': function () {
setTimeout(function() {
console.log(this);
}, 500);
}
}
a.print(); // window对象
setTimeout & setInterval 中,延后执行的内容,this指向window。
new关键字
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,改变this指向。