⑴ javascript中的this到底指什麼
JavaScript:this是什麼?
定義:this是包含它的函數作為方法被調用時所屬的對象。
說明:這句話有點咬嘴,但一個多餘的字也沒有,定義非常准確,我們可以分3部分來理解它!
1、包含它的函數。2、作為方法被調用時。3、所屬的對象。
看例子:
function to_green(){
this.style.color="green";
}
to_green();
上面函數中的this指的是誰?
分析:包含this的函數是,to_green
該函數作為方法被調用了
該函數所屬的對象是。。?我們知道默認情況下,都是window對象。
OK,this就是指的window對象了,to_green中執行語句也就變為,window.style.color="green"
這讓window很上火,因為它並沒有style這么個屬性,所以該語句也就沒什麼作用。
我們在改一下。
window.load=function(){
var example=document.getElementById("example");
example.onclick=to_green;
}
這時this又是什麼呢?
我們知道通過賦值操作,example對象的onclick得到to_green的方法,那麼包含this的函數就是onclick嘍,
那麼this就是example引用的html對象嘍。
this的環境可以隨著函數被賦值給不同的對象而改變!
下面是完整的例子:
<script type="text/javascript">
function to_green(){
this.style.color="green";
}
function init_page(){
var example=document.getElementById("example");
example.onclick=to_green;
}
window.onload=init_page;
</script>
<a href="#" id="example">點擊變綠</a>
⑵ js 函數中this指向誰
誰調用函數,this就指向誰
1.this指向的,永遠是對象
2.this指向誰, 不取決與this寫在哪,而是取決於函數在哪調用
3.this指向的旁答對象,我們成為函數的上下文context,也叫函數的調用者
1.通過函數名()直接調用明前:運槐慧指向window
2.通過對象.函數名()調用:指向這個對象
3.通過數組下標.函數名()調用,指向這個數組
4.通過window內置函數( setInterval setTimeout 等)的回調里調用。指向window
5.函數作為構造函數,new關鍵字實例化之後調用,指向實例化對象
⑶ js-改變this指向的幾種方法
javaScript 為我們專門提供了一些函數方法來幫我們更優雅的處理函數內部 this 的指向問題,常用的有 bind()、call()、apply() 三種方法
call() 方法調用一個對象。簡單理解為調用函數的方式,但是它可以改變函數的 this 指向。
fun.call(thisArg, arg1, arg2, ...)
thisArg:在 fun 函數運行時指定的 this 值
arg1,arg2:傳遞的其他參數
返回值就是函數的返回值,因為它就是調用函數
因此當我們想改變 this 指向,同時想調用這個函數的時候,可以祥大使用 call,比如繼承
fun.apply(thisArg, [argsArray])
thisArg:在fun函數運行時指定的 this 值
argsArray:傳遞的值,必須包含在數組裡面
apply 主要跟數組有關系,比如使用 Math.max() 求數組的最大值
bind() 方法不會調用函數。但是能改變函數內部this 指向
fun.bind(thisArg, arg1, arg2, ...)
thisArg:在 fun 函數運行時指定的 this 值謹穗豎
arg1,arg2:傳遞的其他參數
返回由指定的 this 值和初始化參數改造的原函數拷貝
因此當我們只是想改變 this 指向,並且不想調用這個函數的時候,可以使用 bind
相同點:
都可以改變函數內部的this指向.
區別點:
1.call 和 apply 會調用函數, 並且改變函數內部this指向.
2.call 和 apply 傳遞的參數不一樣, call 傳遞參數 aru1, aru2..形式 apply 必須數組形式[arg]
3.bind 不會調用函數, 可以改變函族野數內部this指向.
主要應用場景:
1.call 經常做繼承.
2.apply 經常跟數組有關系. 比如藉助於數學對象實現數組最大值最小值
3.bind 不調用函數,但是還想改變this指向. 比如改變定時器內部的this指向。
⑷ js中this代表什麼意思
第一個this.name指的是變數name(對應var name="The Window"這個),
第二個this.name指的是object這個map裡面的name,this指的是object這個map對象。
this是Javascript語言的一個關鍵字它代表函數運行時,自動生成的一個內部對象,只能在函數內部使用,下面分四種情況:
情況一:純粹的函數調用 :這是函數的最通常用法,屬於全局性調用,因此this就代表全局對象Global。
情況二:作為對象方法的調用 :函數還可以作為某個對象的方法調用,這時this就指這個上級對象。
情況三 作為構造函數調用 :所謂構造函數,就是通過這個函數生成一個新對象(object)。這時,this就指這個新對象。
情況四 apply調用 :apply()是函數對象的一個方法,它的作用是改變函數的調用對象,它的第一個參數就表示改變後的調用這個函數的對象。因此,this指的就是這第一個參數。
⑸ js中this代表什麼意思
代表當前對象啊,js不是有document.getElementByID通過ID獲取對象么,this就是獲取當前對象,比如id為btn的按鈕的onclick方法
onclick="method(this)",這個this就是當前按鈕對象,作用和document.getElementByID("btn")一樣。
⑹ 如何理解JS中的this指向問題
js中this的指向取決於調用的對抄象
當一個函襲數不是一個對象的屬性時,當作函數來調用,這時函數內的this指向全局對象
當一個函數是一個對象的屬性時,作為該對象的一個方法,當一個方法被調用時,this指向該對象
使用new調用的函數稱為構造器函數,此時的this指向該構造器函數實例出來的對象
apply、call方法可以設定調用者中的this指向誰
⑺ js中的this原理
this 指的是 函數運行時 所在的環境。(不是定義時所在的環境)
怎麼理解這句話呢?看如下例子:
在這個例子中,首先第一個輸出,因為頌明wFunction是運行在全局環境中,所以 this 指向全局環境,所以輸出1;第二個輸出,因為wFunction運行在wObj環境中,所以 this 指向wObj,而wObj的w屬性值為2,所以輸出2;
那麼問題來了,為什麼第二個說是在wObj環境中運行呢,運行環境是怎麼來判別的呢?這得從內存的數據結構說起。
首先,是考慮到內存的數據結構,才設計這個this的。那內存的數據結構是怎樣的呢,先看個例子:
這里,javaScript引擎會在內存里先生成一個對象{w:5},然後把這個對象的內存地址(reference)賦值給wObj變數。
如果通過wObj.w來讀取這個對象的屬性w,則引擎會先從wObj這個變數拿到對象的內存地址,然後從該地址讀出這個對象,返回w屬性。
在看下面一個例子:
這里,javaScript引擎會先將函數function(){...} 單獨保存在內存中 。然後javaScript引擎會在內存里生成一個對象{wFunc:wFunction},而wFunction則是函數的內存地址(reference)。然後把這個對象的內存地址賦值給wObj變數。
如果通過wObj.wFunc()執行函數,則引擎會先從wObj這個變數拿到對象的內存地址,然後從該地址讀出這個對象,返回wFunc屬性,而wFunc屬性的值是函數function(){...}的內存地址(reference),因為這個 是單獨的一個值,所以可以在不同環境(上下文)執行 。在這里函數是通過wObj找到的(wObj的屬性wFunc),所以在wObj環境中執行的。
這里解釋了為啥函數是可以在不同的環境中執行。那麼問題來了,這動態的執行環境,怎麼獲取呢?
針對獲取執行環境問題, this 就這么設計出來了,它的設計目的就是在函數體內部,指代函數 當前的運行環境 。
回到文章開野碧告頭例子,並加以深化如下:
第慧差一個輸出,函數執行時,是通過全局變數wFunction找到函數引用地址的,它的執行環境則是全局,因此輸出全局w,為1;
第二個輸出,函數執行時,是通過wObj指向的對象里的wFunction屬性找到的函數引用地址的,因此,它的執行環境則是wObj指向的對象,因此輸出對象的w,為2;
第三個輸出,函數執行時,是通過全局變數wObjFunc找到函數引用地址的,(因為let wObjFunc = wObj.wFunction;這直接把函數的引用地址直接賦給了全局變數wObjFunc,所以wObjFunc直接指向函數本身)它的執行環境則是全局,因此輸出全局w,為1;
⑻ js函數中的this是什麼意思
this是指在哪個標簽中調用即為哪個標簽對象
例如:<div onclick="this.style.color='red'">red</div> 則是使當前div的內部文字為紅色
⑼ 看一遍就能掌握 js 中的 this 指向
一個基本概念:普通函數的 this 指向不是在定義的時候確定,而是在調用的時候確定。
兩個注意事項:
接下來從一般形式函數調用、方法調用、apply 和 call 調用、箭頭函數、class 等理清指向問題。
所謂一般形式函數調用就是 函數名() ,this 指向全局對象。
一個函數被設置為對象(非全局對象)的屬性值時迅遲逗,就是方法調用,this 指向對象自身。
箭頭函數沒有自己的 this,看其 定義時 外層是否有函數,如果有,外層函數的 this 就是內部箭頭函數的 this,如果沒有,則 this 指向 Window。
一般來說,在 vue 生命周期函數或旦猜自定義方法中 this 指向的是 vue 實例,但是要注意下面的3種情況。
以上理解如果有不對之處請畝賣指出。
⑽ 關於JS的THIS
這個問題問到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())();