一、什么是this?
this简单来说就是当前执行对象的上下文,它总是指向该对象的作用域。
二、介绍this
1、纯粹的函数调用
在js中我们声明的全局变量、函数方法都是一个对象(即一切皆对象的理论)。他们声明之后都是挂载在window对象下,可以把他们理解为window对象的一个属性。
如: var n = 5;
function f() {}
等同于window.n和window.f,全局window可以省略不写
此时的this是指向window对象的,是全局Global。那么,如果在方法f()内,this指向哪里呢?
也是指向全局window对象。为什么呢?我们可以这么理解,当我们想要知道一个this的指向时,不是只关注this是在哪个对象里面的,我们可以去观察这个this的引用对象,通过作用域链,确定当前被操作的实际对象,对于例子中的this,他的执行上下文就相当于window.f。所以window就是这个被操作对象。
2、this被作为对象方法调用
如: function f() {
console.log(this.x);
}
var n = {};
n.x = 4;
n.t = f;
n.t(); // 4
此时的this就是指向被调用的上级对象
3、作为构造函数调用
var x = 2;
function f(){
this.x = 10;
}
var o = new f();
alert(o.x); // 10
此时的this指向新的构造函数
4、通过apply()和call()
通常我们有时需要改变当前作用域,如:
var slef = this;
除了声明一个变量等于当前this之外,可以通过call()和apply()方法。call()和apply()方法功能类似,区别于后面的参数
a.call(b,arg1,arg2…)
apply(b,[arg1,arg2]) //apply只有2个参数,它将call的参数(arg1,arg2…)放在一个数组中作为apply的第二参数
此时this就是第一个参数,即被改变的操作对象的作用范围。