this指向

理解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指向




posted @ 2018-12-25 23:15  梦珀  阅读(142)  评论(0编辑  收藏  举报