Javascript中的this的确是比较灵活,与传统面向对象编程不同,Javascript的函数有很多调用方法,这就使得this的用法也有很多变化。在学习this用法前,最好先了解一共有哪些函数调用方法,这样学习起来就轻松很多了。

1. 函数调用模式

这是最为普通的调用模式,函数只是作为函数来调用。

var number = 1
function func() {
    console.log(this.number);
}
func(); // 1

这个直接调用函数func,console上一定会显示1,因为此时this指的就是window。换一种方法写:

function func() {
    var number = 0;
    console.log(this.number);
}
func();// undefined

这种方法下,调用func后console显示的是undefined。

2. 对象方法调用模式

函数作为对象的一个方法被调用。

var class1 = {
    number : 1,
    func : function() {
        console.log(this.number);
    }
};
class1.func(); // 1

此时this就是指它的上级对象,也就是class1对象。

3. 构造器调用模式

将函数写成构造函数,此时this很易出问题。按照默认约定,构造函数都要开头大写。

var Car = function(name) {
    this.name = name;
}
var car = new Car("1");
console.log(car.name);// "1"

此时this指的就是Car这个对象,它有一个属性是name。但如果不用new来定义car对象,比如直接写成var car = Car("1");那么car里面是不会有name属性的,同时全局window还会出现name属性,这就是因为this此时去指了全局变量window。而不是car,所以写构造函数时一定要注意用new,同时加以开头大写来区分。

4. Apply调用模式

Apply方法可以有两个参数,第一个是让我们写将this绑定到的对象,第二个参数是参数数组。

number = 0;
function func() {
    console.log(this.number);
}
var x = {};
x.number = 1;
x.method = func;
x.method.apply();// 0
x.method.apply(x);// 1

apply方法成功将this的值改变,为空的时候就是全局变量。