不知道是不是熬夜的原因,感觉记忆力好点差,原本理解的东西要是不去翻翻过一段时间就忘了。。。以后有时间还是要多看看以前的博客。
这篇博客用来记录我对javascript中this关键字的理解。下面步入正题。
this的常规用法
在对象方法中使用
示例:1
2
3var obj = {};
obj.x = 5;
obj.y = function(){console.log(this.x)}; //5
在对象的y方法中的this所引用的对象显然是obj这个对象,这个应该不难理解。
在普通函数中引用
1 | function fun1(){console.log(this)}; |
当我们在普通函数中使用this时,它引用的对象是window。我们可以这样理解,因为全局变量都是window的属性,所以fun1()是window的方法,即为window.fun1()。这样就能说通了。
在构造函数中使用
1 | function fun2(){this.x = 5}; |
说明在构造函数中的this指的就是新构造出来的对象。
this的一些其他用法
在call()和apply()中
call()示例1
2
3
4
5function 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
4var doc1 = document.getElementById('doc1');
doc1.onclick = function(){
alert(this.innerHTML);
}
这里的this就指向调用方法的这个对象,也就是doc1。
函数套函数中的this
记得以前写demo的时候花了好久去查这个东西
示例:1
2
3
4
5
6
7
8
9
10var 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
11var obj = {
x : 5,
y : 7,
z : function(){
var that = this;
console.log(this);
setTimeout(function(){
console.log(that.x); //5
},500)
}
}
大致就这些了,要是有遗漏的以后再补充。