簡析javascript的this

來源:互聯網
上載者:User

昨天跟朝沐同學討論到this指標,今天決定憑感覺來寫一篇,或許對某些同學有協助。
慚愧,一直以來,寫碼只是憑感覺,沒有系統的學習過這套那套理論,所以先申明,以下內容大多是感覺描述,沒有去對照權威參考,多有錯漏。

很小白的百度知道一下“javascript this”,搜到了這個:
http://zhidao.baidu.com/question/87695812.html?si=2
其中,網友tkocn的回答重點就是這段:(----沒考證是原創還是引用)
定義:this是包含它的函數作為方法被調用時所屬的對象。
說明:這句話有點咬嘴,但一個多餘的字也沒有,定義非常準確,我們可以分3部分來理解它!
    1、包含它的函數。2、作為方法被調用時。3、所屬的對象。

那就對這段發揮一下吧。
貌似這段話裡“作為方法”這四個字可以去掉,改成這樣:
定義:this是包含它的函數,在被調用時所屬的對象。
說明:這句話有點咬嘴,但一個多餘的字也沒有,定義非常準確,我們可以分3部分來理解它!
    1、包含它的函數。2、在被調用時。3、所屬的對象。

先看以下代碼:
var dbl=function(n){
 this.dblValue=n*2;
 window.alert('n是幾?'+n);
 window.alert('this是誰?'+this.name);
}
問題也就兩個。
“n是幾?”,很好解答:n是函數參數,調用函數時傳幾就是幾。
“this是誰?”,其實也很好回答,this是主人,誰調用函數就是誰。
上面兩個回答裡都有“調用函數”,
那我們看下,通常調用函數會有哪些方式:

 

代碼

  dbl(1); //靜態方式調用,看不到調用主人。this由js引擎決定,在瀏覽器裡,粗略的當作window吧
new dbl(2); //new 方式調用,會臨時new出一個對象,並將this指向它。
var jk={name:'JK'};
jk.dbl=dbl;
jk.dbl(3); //“.”方式調用。這一句很清楚啊,主人就是jk指標所對應的對象。因為在調用時,是通過jk.xx找到那個函數的。簡而言之,就是“.”前面的對象
dbl.call(jk,4); //因為this指向誰,是js引擎的潛規則(假設那咬嘴的定義我們明白不了)。所以js提供一些明規則,讓我們指定“this”是誰。
dbl.apply(jk,[5]); //類似於call。區別只是指定arguments的方式不一樣。
document.body.addEventListener('click',dbl);//然後點擊document.body。//這也是一個典型代表:我們肉眼看不出瀏覽器是如何使用我們添加的監控,所以我們只那去找瀏覽器的相關文檔。

 

 

明白了以上,那再看以下

var tom={name:'Tom',friend:jk};
tom.friend.dbl(6); //按第3條,主人是tom.friend
var Cls=function(name){
this.name=name;
};
Cls.prototype.dbl=dbl;
Cls.prototype.dbl(7); //按第3條,主人是Cls.prototype
var jim=new Cls('Jim');
jim.dbl(6); //按第3條,主人是jim
var funX=function(n){
dbl(n); //按第一條,主人是window
};

理解得差不多了吧。
不過,還沒有。
還是回到這一句:“定義:this是包含它的函數,在被調用時所屬的對象”
最後一個單詞是“對象”,
dbl.call(null,11); //我想把this指定成null可以嗎?----好像不可以哦,別人要的是對象啊,傳null或undefined,就會被忽略。
dbl.call(1,12); //傳一個值,可以嗎?----可以傳,但是最後跟你傳進來的可能會有點差別:會把它轉化成對應的對象。
執行一下以下代碼看看效果:

代碼

var fun=function(){
alert(['this是:'+this,'typeof結果:'+(typeof this),'constructor是:'+this.constructor,'this===window?:'+(this===window)].join('\n'));
}
var arr=[null,undefined,true,1,'hello',fun,{}];
for(var i=0;i<arr.length;i++) fun.call(arr[i]);

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.