javascript中this关键字的理解

不知道是不是熬夜的原因,感觉记忆力好点差,原本理解的东西要是不去翻翻过一段时间就忘了。。。以后有时间还是要多看看以前的博客。
这篇博客用来记录我对javascript中this关键字的理解。下面步入正题。

this的常规用法

在对象方法中使用

示例:

1
2
3
var obj = {};
obj.x = 5;
obj.y = function(){console.log(this.x)}; //5

在对象的y方法中的this所引用的对象显然是obj这个对象,这个应该不难理解。

在普通函数中引用

1
2
function fun1(){console.log(this)};  
fun1(); //window

当我们在普通函数中使用this时,它引用的对象是window。我们可以这样理解,因为全局变量都是window的属性,所以fun1()是window的方法,即为window.fun1()。这样就能说通了。

在构造函数中使用

1
2
3
function fun2(){this.x = 5};
var fifa = new fun2();
fifa.x; //5

说明在构造函数中的this指的就是新构造出来的对象。

this的一些其他用法

在call()和apply()中

call()示例

1
2
3
4
5
function fun3(type,value){
this.type = value;
};

fun3.call(city, size, 5);

这里的call()中有三个参数,第一个参数表示fun3被city对象调用,后面两个参数表示的是传入的两个形参,也就是fun3中的type和value。apply()和call()用法基本一致,区别就是apply()中的形参要放在一个数组中。fun3中的this引用的对象就是city。

事件监听中的this

这个其实也比较常用。
示例:

1
2
3
4
var doc1 = document.getElementById('doc1');
doc1.onclick = function(){
alert(this.innerHTML);
}

这里的this就指向调用方法的这个对象,也就是doc1。

函数套函数中的this

记得以前写demo的时候花了好久去查这个东西
示例:

1
2
3
4
5
6
7
8
9
10
var obj = {
x : 100,
y : 200,
z : function(){
setTimeout(
function(){console.log(this.x)}, 500
)
}
};
obj.z();

这是我们发现obj.z()的结果并不是100。这是因为setTimeout中函数中的this指向的并非是obj,而是全局的window。
遇到这种情况,我们会新建一个that对象来保存this。

1
2
3
4
5
6
7
8
9
10
11
var obj = {
x : 5,
y : 7,
z : function(){
var that = this;
console.log(this);
setTimeout(function(){
console.log(that.x); //5
},500)
}
}

大致就这些了,要是有遗漏的以后再补充。