当前位置: 首页 > Web前端 > HTML

关于这一点的深刻理解和重写call-apply-bind

时间:2023-03-28 18:53:28 HTML

杩欎竴鐐圭殑闂锛屽洜涓烘秹鍙婂埌鐨勭煡璇嗙偣姣旇緝澶氾紝鍒濆鐨勬椂鍊欐€绘槸涓嶆竻妤氥€傛枃妗g湅澶氫簡澶存檿銆備粖澶╁弽澶嶉槄璇昏杽鍏堢敓鐨勬枃浠讹紝鍊熸鏈轰細鍐欎笅鑷繁鐨勪竴浜涙兂娉曪紝宸╁浐璁板繂锛屽姞娣辩悊瑙c€傪煃撳弬鑰冭祫鏂欙細鍓嶇楂樼骇鍩虹锛堜竷锛夛細鍏ㄩ潰瑙hthis鍒氬紑濮嬪涔犵殑鏃跺€欙紝鏈変竴鍙ヨ瘽娣卞緱鎴戝績锛氳皝鍙皝锛宼his灏辨寚鍚戣皝銆傝繖閲岀殑鈥渋t鈥濇寚鐨勬槸鍑芥暟锛岃皝璋冪敤杩欎釜鍑芥暟锛岃繖涓嚱鏁颁腑鐨則his灏辨寚鍚戣皝銆傝繖绉嶈娉曚篃瀵癸紝浣嗕笉瀹屽叏姝g‘銆傚畠鍙槸鎬荤粨浜唗his鎸囧悜鐨勪竴绉嶆儏鍐点€傚湪鍚庢潵鐨勫紑鍙戣繃绋嬩腑锛屾垜瓒婃潵瓒婃剰璇嗗埌杩欑璇存硶鐨勭己闄枫€傝繖涓偣鏄粈涔堟椂鍊欑‘瀹氱殑锛熼鍏堢涓€涓棶棰橈紝杩欎釜鐐规槸浠€涔堟椂鍊欑‘瀹氱殑锛熻鎴戜滑鍥為【涓€涓嬫墽琛屼笂涓嬫枃銆傚湪鎵ц涓婁笅鏂囩殑鍒涘缓闃舵锛屽仛浜嗕笁浠朵簨锛氬垱寤哄彉閲忓璞★紝寤虹珛浣滅敤鍩熼摼锛岀‘瀹歵his鐨勬寚鍚戰焼椼€傛棦鐒秚his鐨勯噸鐐规槸鍦ㄦ墽琛屼笂涓嬫枃鐨勫垱寤洪樁娈靛氨纭畾浜嗭紝閭d箞鎵ц涓婁笅鏂囨槸浠€涔堟椂鍊欏垱寤虹殑鍛紵鎵ц涓婁笅鏂囧彲浠ョ畝鍗曠悊瑙d负褰撳墠浠g爜鐨勬墽琛岀幆澧冿紝浼氬垱寤轰竴涓綔鐢ㄥ煙锛涙墽琛岀幆澧冨垎涓哄叏灞€鐜銆佸嚱鏁扮幆澧冨拰eval锛堝ぇ閮ㄥ垎鎯呭喌涓嬪彲浠ュ拷鐣ワ級锛涘叏灞€鎵ц涓婁笅鏂囦綅浜庤剼鏈唬鐮佺殑寮€澶淬€傚畠琚垱寤猴紱鍑芥暟鐨勬墽琛屼笂涓嬫枃鏄湪璋冪敤鍑芥暟鏃跺垱寤虹殑锛涘綋鎴戠煡閬撯€滅‘瀹氳繖涓€鐐?>鎵ц涓婁笅鏂囧垱寤洪樁娈?>鍑芥暟琚皟鐢ㄢ€濈殑闆嗗悎鏃讹紝鎴戣瘯鐫€闂嚜宸憋紝鈥滆皟鐢ㄥ嚱鏁板彂鐢熶簡浠€涔堬紵鈥濅粈涔堬紵鈥濇垜娌℃湁椹笂鍥炵瓟锛岀劧鍚庢垜鎰忚瘑鍒版垜杩橀渶瑕佹繁鍏ョ悊瑙e拰璁板繂銆傜粨璁猴細杩欎釜鐐规槸鍦ㄦ墽琛屼笂涓嬫枃鍒涘缓闃舵纭畾鐨勨潳浣犱篃鍙互鐞嗚В涓衡€滆繖涓偣鏄湪浠€涔堟椂鍊欑‘瀹氱殑鈥漷hefunctioniscalled鈥濓紝浣嗘槸涓€瀹氳璁颁綇锛岃皟鐢ㄥ嚱鏁颁細鍒涘缓鎵ц涓婁笅鏂囷紝鐒跺悗纭畾this鐐广€倀his鎸囧悜璋侊紵鍥犱负this鐐规槸鍦ㄨ皟鐢ㄥ嚱鏁版椂纭畾鐨勶紝this鐐逛竴涓嚱鏁扮殑瀹氫箟鍙互寰堢伒娲伙紝涓嬮潰鐨勪緥瀛愶紝鍚屼竴涓嚱鏁帮紝鐢变簬璋冪敤鏂瑰紡涓嶅悓锛宼his鎸囧悜涓嶅悓鐨勫璞ara=10;varobj={a:20}functionfn(){console.log(this.a);}fn();//10fn.call(obj);//20銆佺敤call鏀瑰彉this鍙﹀锛屽湪鍑芥暟鎵ц杩囩▼涓紝this涓€鏃︾‘瀹氾紝灏变笉鑳藉啀鏀瑰彉銆倂ara=10;varobj={a:20}functionfn(){this=obj;//杩欏彞璇濆皾璇曚慨鏀箃his锛岃繍琛屽悗浼氭姤閿檆onsole.log(this.a);}fn();,鍏ㄥ眬瀵硅薄涓殑this鍏ㄥ眬瀵硅薄鐨則his鏄竴涓壒娈婄殑瀛樺湪锛屾寚鍚戣嚜韬紝涔熷氨鏄寚鍚戝叏灞€鐜銆?/閫氳繃this缁戝畾鍒板叏灞€瀵硅薄this.a2=20;//閫氳繃澹版槑缁戝畾鍒板彉閲忓璞★紝浣嗘槸鍦ㄥ叏灞€鐜涓嬶紝鍙橀噺瀵硅薄鏈韩灏辨槸vara1=10;//鍙湁璧嬪€兼搷浣滐紝identifier浼氳闅愬紡缁戝畾鍒板叏灞€瀵硅薄a3=30;//杈撳嚭鐨勭粨鏋滈兘浼氱鍚坧re-consoleconsole.log(a1);console.log(a2);console.log(a3);浜屻€佸嚱鏁颁腑鐨則his鍦ㄥ嚱鏁颁笂涓嬫枃涓紝this鐢辫皟鐢ㄨ€呮彁渚涳紝鎸囬拡鐢卞嚱鏁扮殑璋冪敤鏂瑰紡鍐冲畾銆傚鏋滆皟鐢ㄨ€呭嚱鏁板睘浜庝竴涓璞★紝閭d箞褰撳嚱鏁拌璋冪敤鏃讹紝鍐呴儴鐨則his鎸囧悜璇ュ璞°€傚鏋滃嚱鏁拌鐙珛璋冪敤锛岄偅涔堝嚱鏁板唴閮ㄧ殑this鎸囧悜undefined銆傚湪闈炰弗鏍兼ā寮忎笅锛屽綋this鎸囧悜undefined鏃讹紝浼氳嚜鍔ㄦ寚鍚戝叏灞€瀵硅薄銆傝鍑嗙‘鍒ゆ柇this鐨勬寚鍚戯紝鎵惧埌鍑芥暟鐨勮皟鐢ㄨ€咃紝鍖哄垎鏄惁鏄嫭绔嬭皟鐢ㄥ緢閲嶈銆?/涓轰簡鑳藉鍑嗙‘鍒ゆ柇锛屾垜浠湪鍑芥暟鍐呴儴浣跨敤涓ユ牸妯″紡锛屽洜涓洪潪涓ユ牸妯″紡浼氳嚜鍔ㄦ寚鍚戝叏灞€瀵硅薄functionfn(){'usestrict';console.log(this);}fn();//fn涓篊aller锛岀嫭绔嬭皟鐢╳indow.fn()锛?/fn鏄皟鐢ㄨ€咃紝灞炰簬window鍙︿竴涓洶闅剧殑渚嬪瓙锛歷ara=20;varfoo={a:10,getA:function(){returnthis.a;}}console.log(foo.getA());//10vartest=foo.getA;console.log(test());//20test()浣滀负璋冪敤鑰咃紝铏界劧鍜宖oo.getA()涓嶄竴鏍凤紝浣嗘槸鏄嫭绔嬭皟鐢ㄧ殑锛屾墍浠his鎸囧悜undefined銆傚湪闈炰弗鏍兼ā寮忎笅锛屽畠浼氳嚜鍔ㄨ浆鍚戝叏灞€绐楀彛銆倂ara=20;functiongetA(){returnthis.a;}varfoo={a:10,getA:getA}console.log(foo.getA());//10functionfoo(){console.log(this.a)}functionactive(fn){fn();//鐪熸鐨勮皟鐢ㄨ€咃紝鐢ㄤ簬鐙珛璋冪敤}vara=20;varobj={a:10,getA:foo}active(obj.getA);,浣跨敤call,apply鎸囧畾鐩爣thisJavaScript鍐呴儴鎻愪緵浜嗕竴绉嶆満鍒讹紝鍙互璁╂垜浠嚜宸辨墜鍔ㄨ缃畉his鐨勬柟鍚戯紝鍗砪all鍜宎pply銆傗潳褰撲綘鐞嗚Вcall鍜宎pply鐨勬椂鍊欙紝璁板緱鎶婂畠鐞嗚В涓鸿皟鐢ㄥ嚱鏁板苟鎸囧畾this涓虹洰鏍囧璞★紝鑰屼笉鏄瀵硅薄鍘昏皟鐢ㄤ笉灞炰簬鑷繁鐨勬柟娉曘€俧unctionfn(num1,num2){console.log(this.a+num1+num2);}varobj={a:20}fn.call(obj,100,10);//130fn.apply(obj,[20,10]);//50call鍜宎pplay鍚庨潰鐨勫弬鏁伴兘鏄紶閫掔粰瑕佹墽琛岀殑鍑芥暟鐨勫弬鏁般€傝皟鐢ㄤ竴涓竴涓紶閫掞紝apply浠ユ暟缁勭殑褰㈠紡浼犻€掋€傝繖鏄粬浠敮涓€鐨勫尯鍒€?.鏋勯€犲嚱鏁颁腑鐨則hisfunctionPerson(name,age){//杩欓噷this鎸囧悜璋侊紵this.name=鍚嶇О锛涜繖涓€傚勾榫?骞撮緞锛泒Person.prototype.getName=function(){//杩欓噷this鎸囧悜璋侊紵returnthis.name;}//涓婇潰鐨勪袱涓猼his鏄惁鐩稿悓锛屾槸鍚︽寚鍚戝師鍨嬪璞★紵varp1=newPerson('灏煎厠',20);console.log(p1.getName());//褰撯€淣ick鈥濋€氳繃new鎿嶄綔绗﹁皟鐢ㄦ瀯閫犲嚱鏁版椂锛屼細缁忓巻4涓樁娈碉細鍒涘缓涓€涓柊瀵硅薄锛涘皢鏋勯€犲嚱鏁扮殑this鎸囧悜杩欎釜鏂板璞★紙鐙珛璋冪敤鍘熸瀯閫犲嚱鏁帮紝鍐呴儴this鎸囧悜undefined锛夛紱鎵ц鏋勯€犲嚱鏁扮殑浠g爜锛屼负杩欎釜瀵硅薄娣诲姞灞炴€с€佹柟娉曠瓑锛涜繑鍥炰竴涓柊瀵硅薄锛涘綋new鎿嶄綔绗﹁皟鐢ㄦ瀯閫犲嚱鏁版椂锛宼his瀹為檯鎸囧悜鏂板垱寤虹殑瀵硅薄锛屾渶缁堟柊瀵硅薄杩斿洖骞惰example瀵硅薄鎺ュ彈銆傛墍浠ユ垜浠彲浠ヨ鏋勯€犲嚱鏁扮殑this鎸囧悜浜嗘柊鐨勫疄渚嬪璞°€?.绠ご鍑芥暟涓繖涓紙鐗规畩锛塎DN瀹樻柟瑙i噴锛氱澶村嚱鏁扮殑寮曞叆鏈変袱涓綔鐢細鏇寸煭鐨勫嚱鏁板拰涓嶇粦瀹歵his銆傜澶村嚱鏁颁笉鍒涘缓鑷繁鐨則his锛屽畠鍙槸浠庡叾浣滅敤鍩熼摼鐨勪笂涓€灞傜户鎵縯his銆傜澶村嚱鏁拌〃杈惧紡鐨勮娉曟瘮鍑芥暟琛ㄨ揪寮忔洿绠€娲侊紝骞朵笖娌℃湁鑷繁鐨則his銆乤rguments銆乻uper鎴杗ew.target銆傜澶村嚱鏁拌〃杈惧紡鏇撮€傜敤浜庨渶瑕佸尶鍚嶅嚱鏁扮殑鍦版柟锛屽畠涓嶈兘鐢ㄤ綔鏋勯€犲嚱鏁般€傜敱浜庣澶村嚱鏁版病鏈夎嚜宸辩殑this鎸囬拡锛岄€氳繃call()銆乤pply()鎴朾ind()鏂规硶璋冪敤鍑芥暟鏃讹紝鍙兘浼犻€掑弬鏁帮紝涓嶈兘缁戝畾this锛屽畠浠殑绗竴涓弬鏁颁細琚拷鐣?鍙傝€冭祫鏂欙細绠ご鍑芥暟-JavaScript|MDN閲嶅啓call/apply/bind鏂规硶鍖哄埆call鍜宐ind鍙互鎺ュ彈澶氫釜鍙傛暟锛岀涓€涓弬鏁版槸this鎸囧悜鐨勭洰鏍囧璞★紱apply鍙兘鎺ュ彈涓や釜鍙傛暟锛岀涓€涓弬鏁癟his鎸囧悜鐩爣瀵硅薄锛岀浜屼釜鍙傛暟鏄竴涓暟缁勶紝瀛樻斁鍑芥暟浣跨敤鐨勫弬鏁帮紱bind杩斿洖涓€涓嚱鏁帮紝call鍜宎pply绔嬪嵆鎵ц锛沚ind瀹炵幇浜嗗嚱鏁版煰閲屽寲锛屽彲浠ヤ袱娆″悜鐩爣鍑芥暟浼犻€掑弬鏁帮紱璋冪敤//璋冪敤Function.prototype.myCall=function(context,...args){if(context==undefined||context==null){context=window;}console.log(context)context.fn=this;console.log('this',this)//myCall鐨勮皟鐢ㄨ€呮槸涓€涓嚱鏁帮紱constresult=context.fn(...args);console.log(context)//瀵硅薄锛屽寘鎷繖涓偣锛屽拰鎵ц鍑芥暟锛涘垹闄ontext.fn锛?/鍙兘鍥犱负寮曠敤绫诲瀷鏁版嵁鏀瑰彉浜嗗師鍙橀噺锛屽垹闄onsole.log(result)//鍑芥暟鎵ц杩斿洖returnresult;}constobj1={basicNum:1,sum:function(a,b){return(a+b+this.basicNum);}}constobj2={basicNum:10,}console.log(obj1.sum(2,3));console.log(obj1.sum.call(obj2,2,3));console.log(obj1.sum.myCall(obj2,2,3));apply//搴旂敤Function.prototype.myApply=function(context,args){if(context==undefined||context==null){context=window;}context.fn=杩欎釜锛沜onstresult=context.fn(...args);鍒犻櫎context.fn锛涜繑鍥炵粨鏋渳constobj1={basicNum:1,sum:function(a,b){return(a+b+this.basicNum);}}constobj2={basicNum:10,}console.log(obj1.sum(2,3));console.log(obj1.sum.apply(obj2,[2,3]));console.log(obj1.sum.myBind(obj2,[2,3]));bind//缁戝畾Function.prototype.myBind=function(context,...initArgs){if(context==undefined||context==绌猴級涓婁笅鏂?绐楀彛锛沜onst_this=杩欎釜锛涜繑鍥炲嚱鏁?...args){context.fn=_this;constresult=context.fn(...initArgs,...args);杩斿洖缁撴灉锛泒}constobj1={basicNum:1,sum:function(a,b){return(a+b+this.basicNum);}}constobj2={basicNum:10,}console.log(obj1.sum(2,3));console.log(obj1.sum.bind(obj2,2,3)());console.log(obj1.sum.myBind(obj2,2)(3));琛ュ厖鐗规畩鎯呭喌锛岃鑰冭檻constobj={birth:1990,getAge:function(year){letfn=y=>{console.log(this);//objreturny-this.birth;}console.log(fn.prototype);//undefinedreturnfn.call({birth:2000},year);}};console.log(obj.getAge(2020));//20杩樻槸30锛熸寜鐓у墠闈㈢殑璇存硶锛宑all鏀瑰彉浜唗his鐨勬柟鍚戯紝閭d箞绛旀鏄?020-2000锛屽簲璇ユ槸30锛涗絾鏄紝fn鏄竴涓澶村嚱鏁帮紝鏈韩娌℃湁this瀵硅薄锛屼篃娌℃湁鍘熷瀷瀵硅薄锛岃皟鐢ㄤ笉鑳芥敼鍙榯his鐨勬柟鍚戯紱