关于javascript this问题

this是Javascript语言的一个关键字。 
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。例如:

function person() {    
        this.name = 'jack';
        this.age  = 12;          
    }

函数使用场合的不同,this的值也会发生相应变化。但是有一个总的原则,那就是this指的是,调用该函数的那个对象。 

下面来说说this的用法。 

function person() {    
        this.age = 12;    
        alert(this.age);    
    }

    person(); // 12

这个是通常的用法,this代表全局对象Global,实则,person的调用是   window.peroson()    this-》window

var age = 12;
    function person() {       
        alert(this.age);    
    }

    person(); // 12

我们可以看一下 ,将age在全局声明,结果仍是12;

那我们再来变一下:

var age = 12;
    function person() {
        this.age = 10;       
        alert(this.age);    
    }
    person();
    alert(age) // 10

=============================================================

function person() {     
        alert(this.age);    
    }
    var obj = new Object();
    obj.age = 10;
    obj.fn = person;
    obj.fn();

上面我们创建一个空对象 给对象的age属性赋值,对象的方法就是person,直接调用 ,此时this的调用对象是obj,obj的age是10;

===========================================================

function person() {     
        this.age = 10;    
    }
    var obj = new person();
    alert(obj.age)

我们来用person创建一个构造函数  此时函数生成一个新的对象,很多人可能不太明白这个对象的由来:

function person() {  
        var obj = new Object(); 
        obj.age = 10;  
        return obj;
    }
    // var obj = new person();
    alert(person().age)

这样写会不会看起来一下豁然开朗呢?原来当我们new person()的时候,perison内部会自动创建一个空对象赋值给this,然后再返回this。所以自然就可以用新创建的构造函数去操作了!

   var age = 12;
    function person() {       
        this.age = 10;      
    }
    var obj = new person();
    alert(age) //12

而此时age的值是12 ,不难看出,这时的age已经并不是全局的了。当然如果把构造函数干掉 变成window.person();age依然是全局,想必大家已经明白了this的用法了

==========================================================

var age = 12;
    function person() {       
        alert(this.age);      
    }
    var obj = new Object();
    obj.age = 10;
    obj.fn = person;
    obj.fn.apply();//12

最后说一下,apply和call吧,改变this指向,像这样obj.fn.apply(obj) 括号内放this要指向的对象。这样对象指向obj结果将会是obj的age

文笔粗糙,如有错误,忘大神指正。 

原文地址:https://www.cnblogs.com/Midaoi/p/4941306.html