亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于JS的THIS?

關于JS的THIS?

飲歌長嘯 2019-02-13 14:06:20
因為想看EXT的JS源碼,但是JS比較差,練了下JS,各位高手幫我看下,解釋下原因:function a(value){this.value =value;alert(this.vlaue);}alert(new a(1).value);alert(window.a(3));順便問下function a(){fucntion b(){}return b;}new a()() 為什么這么寫? 為什么不寫 a().b()?
查看完整描述

2 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

這個問題問到js的精髓了。

在js中,萬物皆對象,函數只是對象的一種。

js的this,指代著當前對象的自身(itself),但通過你的問題的內容,發現,你關注的地方并不單單在this關鍵詞。

function a(value){
this.value =value;
alert(this.vlaue);
}
上面的這個函數語句,意味著,創建了名字為a,參數為value的函數對象
這個函數對象有一個來自于參數的動態屬性value;
這個函數對象還有一個返回值為void的window內置函數alert;
這個函數對象自身沒有返回值(void)。

alert(new a(1).value);
上面的這個語句,意味著,新建一個參數為1的a對象,并把這個對象的value作為參數賦值給window的alert函數,并執行window的alert函數。
在上面的語句中,測試時,會出現兩次警告框,且警告框的內容都是1,這是因為在新建a對象的時候,執行了一次alert,拿到a對象的value后,又執行了一次alert。

alert(window.a(3));
上面的這個語句,意味著,把3作為window對象的a函數的一個參數,執行a函數。
在上面的語句中,測試時,也會出現兩次警告框,但是第一次是3,第二次就是undefined了,這是因為,window.a(3)執行的時候,會alert一下,內容就是3,alert(...)執行的時候,因為里面的window.a(3)沒有返回值,所以alert的參數就是沒有,所以就導致彈出了一個“undefined”

function a(){
fucntion b(){}
return b;
}
new a()()
可以這么寫(new a()())的原因是:
1、“new a()” ,這個是個對象創建過程,就是說,這樣可以創建一個全新的函數對象。
2、第二個“()”,這個是個函數執行過程,就是說,加上一對“()”后,這個對象函數才開始執行。

a().b()
不可以這么寫的原因是:
a()會讓這個a函數對象執行后,返回的是一個名字為沒有名字的空函數對象,這個空函數對象里面,并沒有一個名字叫b的方法。
你如果想讓上面的a里面的b函數順利執行,可以參考下面的案例:
function a(){
function b(){alert(111)}
return b;
}
a()();//這樣你就順利的看到這個b函數執行了。

最后給你一個讓你頭暈的案例,呵呵??紤]一下是如何執行的,這個案例你完全搞明白后,基本上js的函數對象返回值問題,就不會再有了。
function a(){
this.b = function (){
return this.c = function(){
alert(111);
}
}
}
(new a().b())();




查看完整回答
反對 回復 2019-03-24
?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

this就是指當前對象,這在js的高級應用中相當重要。系統默認this指向window
對于 new a()(),我們把它拆開來看就很明了了:
var o = new a();
o();
首先創建一個類a的一個對象o,在js中你可以把一個對象當做一個函數來用,所以o()就是執行這個對象的函數體。
至于a().b()為什么不行呢?
這里的意思并不是調用a里面的b方法,如果你要調用a里面的b方法應當寫成new a().b();在js中只有對象才能調用對象里面的方法,在js中類、函數、對象在代碼中時看不出來的,只有在調用的時候才能區分出,就如你上面這個例子,我們可以說這是一個閉包(也就是函數里面嵌入函數),此時a是window下面的一個函數,b是嵌入在函數a里面的一個函數。但如果你new了a,那么此時a就是一個類了,但是此時b并不是a里面的方法,而是window下面的方法,在js中如果變量、函數你不申明屬于誰,那么系統就默認為是在window下的,如果你要讓b是a的方法,應當寫成:
function a(){
this.b=function(){}
}
或者寫成
function a(){
a.prototype.b=function(){}
}
希望可以幫到你,要學ExtJs,首先必須了解js面向對象,js水平不能再停留在我們簡單表當驗證了



查看完整回答
反對 回復 2019-03-24
  • 2 回答
  • 0 關注
  • 580 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號