本文小編為大家詳細(xì)介紹“javascript的this指向怎么理解”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“javascript的this指向怎么理解”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
創(chuàng)新互聯(lián)公司致力于成都網(wǎng)站建設(shè)、網(wǎng)站制作,成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場(chǎng)競(jìng)爭(zhēng)中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!

在我們看見的各種介紹如何判斷this的指向方法中,"this的最終指向的是那個(gè)調(diào)用它的對(duì)象"這句話被視作核心,但是面對(duì)多種多樣的情況,我們?nèi)菀赘慊臁a槍?duì)針對(duì)多種情況結(jié)合我的理解,我提出了一句話 “箭頭,定時(shí)和構(gòu)造,特殊情況特殊看,普通調(diào)用看點(diǎn)號(hào),后面有點(diǎn)不看前,然后就近原則判,最后剩下就是window”。
箭頭函數(shù)
箭頭函數(shù)的本身沒有this,所有不存在this改變,它捕獲外層的this使用
var name = "windowsName";
var a = {
name: "Cherry",
fn() {
setTimeout(()=>{
console.log(this.name);
},0)
}
}
a.fn() //Cherry解析: 首先對(duì)象a調(diào)用fn函數(shù),所以fn函數(shù)的this指向?qū)ο骯,然后箭頭捕獲外層this,那么就不是setTimeout里的this,而是fn函數(shù)的this,所以最后拿到對(duì)象a里的name
定時(shí)器
對(duì)于延時(shí)函數(shù)內(nèi)部的回調(diào)函數(shù)的this指向全局對(duì)象window
var name = "windowsName";
var a = {
name: "Cherry",
fn() {
setTimeout(function (){
console.log(this.name);
},0)
}
}
a.fn() //windowsName解析: 首先對(duì)象a調(diào)用fn函數(shù),然后這里setTimeout里的回調(diào)函數(shù)是匿名函數(shù),為普通的函數(shù),那么匿名函數(shù)中的this指向的就是window
var name = "windowsName";
var b={
name: "setTimeoutName"
}
var a = {
name: "Cherry",
fn() {
setTimeout((function (){
console.log(this.name);
}).bind(b),0)
}
}
a.fn() //setTimeoutName解析:首先對(duì)象a調(diào)用fn函數(shù),然后這里setTimeout里的回調(diào)函數(shù)是匿名函數(shù),為普通的函數(shù),那么匿名函數(shù)中的this指向的就是window,但使用bind改變匿名函數(shù)的this指向?yàn)閷?duì)象b,所以最后對(duì)象b里的name
構(gòu)造函數(shù)
構(gòu)造函數(shù)中的this指向創(chuàng)建的實(shí)例對(duì)象,
注意:如果構(gòu)造函數(shù)中返回一個(gè)對(duì)象,創(chuàng)建時(shí)不會(huì)有新的實(shí)例對(duì)象,而是這個(gè)返回的對(duì)象
function fn(){
this.age = 37;
}
var a = new fn();
console.log(a.age); // 37
a.age = 38;
console.log(fn); // { this.age = 37; }
console.log(a.age); // 38解析:這里我們通過構(gòu)造函數(shù)創(chuàng)建實(shí)例對(duì)象a,相當(dāng)于開辟一個(gè)新地方將構(gòu)造函數(shù)內(nèi)容復(fù)制過來,就有了a對(duì)象,這時(shí)候this指向的就是對(duì)象a,我們修改對(duì)象a中內(nèi)容不影響構(gòu)造函數(shù)
點(diǎn)號(hào)判斷
通過.判斷this指向,遵循就近原則
var a = {
age:10,
b: {
age:12,
fn(){
console.log(this.age);
}
}
}
a.b.fn(); //12解析:對(duì)象a調(diào)用對(duì)象b的fn函數(shù),fn函數(shù)前面有兩個(gè).,那么最近的是對(duì)象b,所以fn函數(shù)的this指向的就是對(duì)象b,最后拿到的就是對(duì)象b的age
var a = {
age:10,
b: {
age:12,
fn(){
console.log(this.age); //undefined
}
}
}
var c = {
age:20,
}
var d = {
age:30,
}
a.b.fn.bind(c).bind(d)(); //20解析:對(duì)象a調(diào)用對(duì)象b的fn函數(shù)然后使用bind改變this的指向,這時(shí)候fn前后前后都有.,不看前面的.,只用看后面的,然后最近的bind改變this指向?yàn)閏,那么此時(shí)fn函數(shù)的this指向的就是對(duì)象c,拿到的就是對(duì)象c的age
練習(xí)
function outerFunc() {
console.log(this) // { x: 1 }
function func() {
console.log(this) // Window
}
func()
}
outerFunc.bind({ x: 1 })()obj = {
func() {
const arrowFunc = () => {
console.log(this._name)
}
return arrowFunc
},
_name: "obj",
}
obj.func()() //obj
func = obj.func
func()() //undefined
obj.func.bind({ _name: "newObj" })()() //newObj
obj.func.bind()()() //undefined
obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })() //bindObj使用 apply、call、bind 函數(shù)可以改變this的指向,上面this的例子中使用到
區(qū)別
thisArg , [ argsArray] call(thisArg, arg1, arg2, ...)
apply和call函數(shù)區(qū)別在于this后面?zhèn)魅氲膮?shù),apply中傳的是一個(gè)數(shù)組,而call中傳入的是展開的參數(shù)
bind(thisArg[, arg1[, arg2[, ...]]])()
然后bind函數(shù)創(chuàng)建的是一個(gè)新的函數(shù),需要手動(dòng)去調(diào)用
這個(gè)新函數(shù)的 this 被指定為 bind() 的第一個(gè)參數(shù),而其余參數(shù)將作為新函數(shù)的參數(shù),供調(diào)用時(shí)使用
讀到這里,這篇“javascript的this指向怎么理解”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:javascript的this指向怎么理解
標(biāo)題鏈接:http://www.chinadenli.net/article48/pisshp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、外貿(mào)建站、企業(yè)建站、、網(wǎng)站導(dǎo)航、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)