this是javascript语言的一个关键字,写代码时会经常用,所以好好理解this,再运用,可以避免走进坑。下面是一些我个人的一些小小的见解,如有错误,欢迎指正!
1、在全局作用域下调用this,this指向window
console.log(this);//window
在浏览器中执行上面的代码,打印出来的是一个window对象,这是一个全局对象。
2、函数被直接调用this,this指向window
var x = 1;
function test(){
console.log(this.x); // 1
}
test();
普通函数调用this时,是全局性调用,所以this就代表全局对象window。可以再上面的代码加上一行代码,大家看下效果……
var x = 1;
function test(){
var x = 2;
console.log(this.x); // 1
}
test();
这个打印出来的为什么是1呢?
上面说到了,普通函数调用this,this指向window。很显然这是一个普通函数,这个this指向是window,而var x = 1,是全局的。var x = 2;是局部的,所以打印出来的是1。再来看一下,把var x = 2;变成全局的……
var x = 1;
function test(){
x = 2;
console.log(this.x); // 2
}
test();
这时候打印出来的就是2了,原因就是x = 2是全局的。
3、this作为对象的方法调用
var x = 1;
function test(){
console.log(this.x); //2
}
var obj = {x:2,fn:test};
obj.fn();
函数可以作为某个对象的方法调用,这时的this就指这个对象。
4、this作为构造函数调用
var x = 1;
function test(){
this.x = 2;
}
var obj = new test();
console.log(x);//1
console.log(obj.x);//2
运行上面的代码可以看到,全局对象中的x并没有被改变,而此时this指向该构造函数新创建的对象obj。
5、通过apply或call方法调用
apply()和call()都是函数对象的方法,作用是改变函数的调用对象。关于这两个方法我会再写一篇博客的,大家都有兴趣的,可以看下。由于这两个方法的用法类似,这里我就以apply方法为例:
var x = 1;
function test(){
console.log(this.x);
}
var obj = {x:2,fn:test}
obj.fn.apply();
apply()的参数为空时,默认调用全局对象。因此,这时运行结果是1,所以这时的this指向的是window。为了改变this的指向,我们需要传递一个参数。把代码修改如下:
var x = 1;
function test(){
console.log(this.x);
}
var obj = {x:2};
test.apply(obj);
运行结果是2,说明这时this指向的是对象obj。