那么,什么是this? 我一下子回到了上初中的時(shí)候:
問:who is that ?
答:This is Tom speaking
在英語里面,this是一個(gè)代詞,用來指敘述中的人或事物,即指前面提到過的人或事物或下文提及的事物。
OK,如果你的棒(zha)棒(zha)的英語能理解到這個(gè)份上,我還能說啥,點(diǎn)擊右上角那個(gè)像X一樣的叉叉,慢走,不送。
一個(gè)東西我們?nèi)绻诓恢朗巧兜臅r(shí)候說再多的廢話也是徒勞,我們還是直接看代碼吧:
var obj={
a:1,
getA:function(){
console.log(this==obj);
console.log(this.a);
}
};
obj.getA();
上面的代碼我們直接的看,OK,有一個(gè)對(duì)象叫obj,調(diào)用了這個(gè)對(duì)象的一個(gè)方法叫g(shù)etA,好的,看getA方法里面,赤裸裸的有一個(gè)關(guān)鍵詞叫g(shù)et有沒有,這個(gè)this是啥意思呢?
聽好了,this法則第一條:
對(duì)長(zhǎng)得像這樣的:
XXX.fn();
這個(gè)fn的作用域環(huán)境里面如果你用上了this,這個(gè)this指的就是這個(gè)XXX。
OK,于是,有人就問了,teacher,請(qǐng)問下面這個(gè)時(shí)候,this代表的為啥是window?
var fn = function(){
console.log(this);
}
這個(gè)嘛,我想用下面的一行代碼來回敬這位同學(xué):
window.fn === fn
OK,我們了解了this了,慢著,這只是大部分情況下this的用法,this也有一些特殊情況我們需要了解的,我們只有掌握了這些特殊情況才可以算真正的掌握了this。
我們復(fù)習(xí)一下對(duì)象的創(chuàng)建方式,我們知道,對(duì)象有二種創(chuàng)建方式,誰說下有哪二種方式創(chuàng)建?(停頓一會(huì)兒)
var obj = {};//字面量
var obj = new Object();
是的,對(duì)象可以用字面量來創(chuàng)建,當(dāng)然,有一種不常用但是確實(shí)也可以用的是用構(gòu)造函數(shù)的方式來創(chuàng)建,那我們就來看一下,在構(gòu)造函數(shù)里這個(gè)this是怎么一個(gè)意思,首先我來寫一個(gè)這樣的構(gòu)造函數(shù):
var Klass = function(){
this.name = "moyu-edu.com";
}
OK,我們來用一下:
var xiaoMo = new Klass();
這個(gè)工作原理是怎么樣子的呢?
其實(shí)是這樣的:把這個(gè)構(gòu)造函數(shù)里面的this指向的即將創(chuàng)建出來的這個(gè)對(duì)象。
那我們現(xiàn)在知道了,其實(shí)當(dāng)一個(gè)構(gòu)造函數(shù)在執(zhí)行的時(shí)候,里面的this指向的就不再是window了,而是這個(gè)將要?jiǎng)?chuàng)建出來的對(duì)象了。
這是一個(gè)特殊的地方大家要記住,還有一個(gè)特殊的地方要說明一點(diǎn):
函數(shù)內(nèi)部的函數(shù)里的this指向的是window。
為了驗(yàn)證這句話,我們來寫一些代碼:
var obj = {
fn:function(){
function fn1(){
console.log(this);
}
fn1();
}
}
obj.fn();
setTimeout(function(){
function fn(){
console.log(this);
}
},1000);
<style>
#demo{
width: 300px;
height: 300px;
background-color: pink;
}
</style>
<div id="demo"></div>
<script>
document.addEventListener("DOMContentLoaded",function(){
var oDiv = document.getElementById("demo");
oDiv.onclick = function(){
console.log(this);
function fn(){
console.log(this);
}
fn();
}
},false);
</script>
OK,30分鐘到了,新技能get!!!