浅谈this

this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指向调用函数的那个对象

1.普通函数调用时,在全局作用域下,this指向的是windows对象。

//函数声明
function text1(){
    console.log(this);//window
    this.a = 10;
}
text1();
console.log(a);//10
console.log(this);//window
//匿名函数
(function(){
    console.log(this);//window
    this.a = 30;
})();
console.log(a);//10
console.log(this);//window
//函数表达式
var text2 = function(){
    console.log(this);//window
    this.a = 20;
}
text2();
console.log(a);//20

2. 作为构造函数调用:new关键字构造的对象,this指向创建该对象的函数

var fn = function(){
    console.log(this);//fn{}
    this.x = 10;
    this.y = 20;
    return this.x;
}
var fn2 = new fn();
console.log(fn2.x);//10

3. 作为对象方法的调用:this当前所在函数是对象的属性时,this指向该对象。

var obj = {
    x: 10,
    y: 20,
    fn: function(){
        console.log(this);//obj
        this.x = 100;
    }
}
obj.fn();
console.log(obj.x);//100

4. apply() call()
咱们先回顾一下这两个方法的定义吧!
call方法:
语法:call(thisObj,Object)
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:
语法:apply(thisObj,[argArray])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

var x = 0;
function test(){
    alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为

o.m.apply(o); //1

运行结果就变成了1,证明了这时this代表的是对象o。