理解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关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
通过new关键字创建的对象,若构造函数有返回值,且返回值为对象,则创建的对象为返回值,返回值不为对象,创建的对象为构造的对象,更多请看new关键字。
严格模式中默认this不在指向window,而是undefined。
更多关于this,改变this指向。