摘要:關(guān)于前端中是個(gè)老生常談的問(wèn)題,總是說(shuō)不清道不明,看這里。的大致用法,相信接觸過(guò)前端的同學(xué)都知道,無(wú)非以下種。先想一下,兩次執(zhí)行后結(jié)果是什么。輸出總結(jié)被誰(shuí)調(diào)用指向誰(shuí),沒(méi)有被調(diào)用的情況下,瀏覽器默認(rèn)為。由于箭頭函數(shù)中的,總是指向父級(jí)作用域。
關(guān)于this
前端中this是個(gè)老生常談的問(wèn)題,總是說(shuō)不清道不明,看這里。
this只能用在函數(shù)里面,相信全世界的人都知道。
this就是函數(shù)在被執(zhí)行的時(shí)候,產(chǎn)生的執(zhí)行上下文(context)。
this的大致用法,相信接觸過(guò)前端的同學(xué)都知道,無(wú)非以下5種。
1、 function test(){ console.log(this); } test(); //不是對(duì)象的屬性,直接執(zhí)行 2、 var object = { test: test() { console.log(this); } } object.test(); //作為對(duì)象的屬性被調(diào)用 3、 test.call(object); // apply用法差不多 4、 Function test() { this.name = test; } 5、箭頭函數(shù)中的this
其中第4種構(gòu)造函數(shù)沒(méi)什么可說(shuō)的,構(gòu)造出了誰(shuí),誰(shuí)就是this。
平常用的最多的也就是前3種,先說(shuō)第3種情況。最后說(shuō)第5種。
第3種情況被執(zhí)行的時(shí)候,
object就是作為函數(shù)參數(shù)被傳入到test()中,這個(gè)函數(shù)參數(shù)就是this。
也就是說(shuō)在test()被執(zhí)行的時(shí)候,this就是指向object。
第1種,第2種情況就是第3種情況的語(yǔ)法糖。
test.call(undefined); object.test.call(object); //被誰(shuí)調(diào)用指向誰(shuí)
如果你傳的 context 不是一個(gè)對(duì)象,那么在瀏覽器中默認(rèn)是 window 對(duì)象。
分析下面的例子:
var name = "hut"; var obj = { name : "lucy", foo : function() { console.log(this.name); } } obj.foo(); var otherObj = { name : "john", foo : obj.foo } obj.foo(); otherObj.foo();
那么obj.foo(); otherObj.foo(); 就是我們上面所說(shuō)的第2種情況。
先想一下,兩次執(zhí)行后結(jié)果是什么。
obj.foo() 其實(shí)就是:obj.foo.bind(obj),
也就是說(shuō)函數(shù)在被執(zhí)行的時(shí)候,是被obj調(diào)用的,那么函數(shù)內(nèi)的this就是obj
function() { console.log(this.name); // 輸出lucy }
執(zhí)行上下文(context)中的this是指向obj
otherObj.foo() 其實(shí)就是obj.foo.bind(otherObj)
也就是說(shuō)函數(shù)在被執(zhí)行的時(shí)候,是被otherObj調(diào)用的,那么函數(shù)內(nèi)的this就是otherObj
function() { console.log(this.name); // 輸出john }
再來(lái)看一個(gè)例子:
var name = "Bob"; var obj = { name = "lucy", foo : function() { console.log(this.name); } } obj.foo(); var otherObj = { name :"john", foo : function() { var testFunc = obj.foo(); testFunc(); } } otherObj.foo();
分析:
執(zhí)行otherObj.foo(); 后,接著執(zhí)行obj.foo();,也就是說(shuō)執(zhí)行下面的函數(shù)。
那么這個(gè)函數(shù)是被誰(shuí)調(diào)用的呢,誰(shuí)也沒(méi)有調(diào)用這個(gè)函數(shù)obj.foo()前面誰(shuí)也沒(méi)有。
也就是obj.foo.bind(undefined);,
function() { console.log(this.name); // 輸出Bob }
最后看一個(gè)例子:
var name = "Bot"; var obj = { name : "lucy", showName: function() { console.log(this.name) }, foo : function() { (function(callback) { callback(); })(this.showName) } } obj.foo();
分析:
執(zhí)行obj.foo(); 后,this.showName中的this就是obj,
也就是將obj.showName;傳給cb,由于是立即執(zhí)行函數(shù),
則執(zhí)行callback();也就是執(zhí)行下面的函數(shù)
那么這個(gè)函數(shù)是被誰(shuí)調(diào)用的呢,誰(shuí)也沒(méi)有調(diào)用這個(gè)函數(shù)callback前面誰(shuí)也沒(méi)有。
也就是obj.showName.bind(undefined);,輸出Bob。
function() { console.log(this.name); // 輸出Bob }
總結(jié):
this被誰(shuí)調(diào)用指向誰(shuí),沒(méi)有被調(diào)用的情況下,瀏覽器默認(rèn)為window。
特殊情況:
setTimeout,setInterval,匿名函數(shù)執(zhí)行的時(shí)候,
函數(shù)體內(nèi)的this為全局對(duì)象window。
最后說(shuō)第5種,箭頭函數(shù)中的this。
箭頭函數(shù)內(nèi)部并沒(méi)有實(shí)現(xiàn)綁定this的機(jī)制,其實(shí)箭頭函數(shù)并沒(méi)有自己的this,
箭頭函數(shù)內(nèi)部的this總是指向父級(jí)作用域。
什么意思呢,看個(gè)例子。
var name = "Bob"; var obj = { name : "a", showName: () => { console.log(this.name); } } obj.showName(); // Bob
分析:
obj.showName()是在全局作用域下被調(diào)用的,然后執(zhí)行下面的函數(shù)。
() => { console.log(this.name); }
由于箭頭函數(shù)中的this,總是指向父級(jí)作用域。
obj.showName()是在全局作用域下被調(diào)用的,不是obj,obj啥也不是。
所以輸出Bob。
function add(a,b,c) { console.log(this); return a+b+c; }
以上3個(gè)方法都是函數(shù)的方法,call和apply都可以改變函數(shù)this,傳遞的參數(shù)方式不同。
call一個(gè)一個(gè)傳遞,add.call(obj, 1,2,3);
apply以數(shù)組的方式傳遞,add.apply(obj, [1,2,3]);,更方便。
bind也可以改變函數(shù)內(nèi)部的this,它還可以傳遞固定參數(shù),
var fix = add.bind(null, 100);
函數(shù)bind后,與call,apply方法的另一個(gè)區(qū)別是,
bind便不立即執(zhí)行,而apply,call會(huì)立即執(zhí)行,
add.apply(obj, [1,2,3]); 會(huì)立即執(zhí)行得到結(jié)果6,
但是函數(shù)bind后,var fix = add.bind(null, 100);便不會(huì)立即執(zhí)行,
fix(2,3),調(diào)用后才會(huì)執(zhí)行,得到結(jié)果105,
var fix = add.bind(null, 100);綁定了第一個(gè)參數(shù)為100,
相當(dāng)與固定了第一個(gè)參數(shù)的值為100,fix函數(shù)被調(diào)用后,則只需要傳入之后的參數(shù)即可。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95822.html
摘要:一些知識(shí)點(diǎn)有哪些方法方法前端從入門(mén)菜鳥(niǎo)到實(shí)踐老司機(jī)所需要的資料與指南合集前端掘金前端從入門(mén)菜鳥(niǎo)到實(shí)踐老司機(jī)所需要的資料與指南合集歸屬于筆者的前端入門(mén)與最佳實(shí)踐。 工欲善其事必先利其器-前端實(shí)習(xí)簡(jiǎn)歷篇 - 掘金 有幸認(rèn)識(shí)很多在大廠工作的學(xué)長(zhǎng),在春招正式開(kāi)始前為我提供很多內(nèi)部推薦的機(jī)會(huì),非常感謝他們對(duì)我的幫助。現(xiàn)在就要去北京了,對(duì)第一份正式的實(shí)習(xí)工作也充滿(mǎn)期待,也希望把自己遇到的一些問(wèn)題和...
摘要:主講人石小勇騰訊高級(jí)前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計(jì)工作閑聊前端從移動(dòng)時(shí)代開(kāi)始,前后端分離之后,前端這個(gè)崗位才開(kāi)始慢慢火起來(lái)一線(xiàn)城市前端需求量大,但合格前端很少大話(huà)面試面試如相親,為什么這么說(shuō)五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級(jí)前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計(jì)工作) 1.閑聊前端 ...
摘要:主講人石小勇騰訊高級(jí)前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計(jì)工作閑聊前端從移動(dòng)時(shí)代開(kāi)始,前后端分離之后,前端這個(gè)崗位才開(kāi)始慢慢火起來(lái)一線(xiàn)城市前端需求量大,但合格前端很少大話(huà)面試面試如相親,為什么這么說(shuō)五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級(jí)前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計(jì)工作) 1.閑聊前端 ...
摘要:主講人石小勇騰訊高級(jí)前端工程師,核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊興趣部落的研發(fā)設(shè)計(jì)工作閑聊前端從移動(dòng)時(shí)代開(kāi)始,前后端分離之后,前端這個(gè)崗位才開(kāi)始慢慢火起來(lái)一線(xiàn)城市前端需求量大,但合格前端很少大話(huà)面試面試如相親,為什么這么說(shuō)五大要素顏王面試的第一 主講人:AlloyTeam@石小勇(騰訊高級(jí)前端工程師,AlloyTeam核心成員之一,現(xiàn)主要負(fù)責(zé)騰訊QQ興趣部落的研發(fā)設(shè)計(jì)工作) 1.閑聊前端 ...
摘要:獲取的對(duì)象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對(duì)象即使沒(méi)有代碼,也會(huì)把默認(rèn)的祖宗八代都顯示出來(lái)而只能獲取元素屬性中的樣式。因此對(duì)于一個(gè)光禿禿的元素,方法返回對(duì)象中屬性值如果有就是據(jù)我測(cè)試不同環(huán)境結(jié)果可能有差異而就是。 花了很長(zhǎng)時(shí)間整理的前端面試資源,喜歡請(qǐng)大家不要吝嗇star~ 別只收藏,點(diǎn)個(gè)贊,點(diǎn)個(gè)star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項(xiàng)目地址 https:...
摘要:前言月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議那么今天我就把看過(guò)的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開(kāi)始出沒(méi)社區(qū),現(xiàn)在差不多9月了,按照工作的說(shuō)法,就是差不多過(guò)了三個(gè)月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來(lái)說(shuō),差不多到了轉(zhuǎn)正的時(shí)候,會(huì)進(jìn)行總結(jié)或者分享會(huì)議!那么今天我就...
閱讀 2011·2023-04-25 16:53
閱讀 1455·2021-10-13 09:39
閱讀 619·2021-09-08 09:35
閱讀 1652·2019-08-30 13:03
閱讀 2132·2019-08-30 11:06
閱讀 1841·2019-08-30 10:59
閱讀 3198·2019-08-29 17:00
閱讀 2300·2019-08-23 17:55