摘要:最近讀到了一篇介紹中的四種使用場景的文章,感覺總結(jié)的很好,所以我認(rèn)真讀了讀,并且動手實(shí)踐了其中的,與大家共享。
最近讀到了一篇介紹js中this的四種使用場景的文章,感覺總結(jié)的很好,所以我認(rèn)真讀了讀,并且動手實(shí)踐了其中的demo,與大家共享。原文鏈接:
https://github.com/alsotang/n...
遇到this,一直要記得這句:函數(shù)執(zhí)行時,this總是指向調(diào)用該函數(shù)的對象(即:判斷this所在的函數(shù)屬于誰)。
1、函數(shù)有所屬對象,則指向所屬對象
var myObject={ value:100 }; myObject.getValue=function(){ console.log(this.value); console.log(this); return this.value; } console.log(myObject.getValue());
這里的getValue屬于對象myObject,所以this就指向myObject,執(zhí)行結(jié)果如下:
2、函數(shù)沒有所屬對象時,就指向全局對象(window或global)
var myObject={ value:100 }; myObject.getValue=function(){ var foo=function(){ console.log(this.value); console.log(this); } foo(); return this.value; } console.log(myObject.getValue());
在這里,foo屬于全局對象,所以foo函數(shù)打印的this.value為undefined。
寫到這里,我又想起setTimeout和setInterval方法也是屬于全局對象的,所以在這兩個函數(shù)體內(nèi)this是指向全局的,所以也是這種情況,如下:
var myObject={ value:100 }; myObject.getValue=function(){ setTimeout(function(){ console.log(this.value); console.log(this); },0); return this.value; } console.log(myObject.getValue());
執(zhí)行結(jié)果如下:
所以,如果要得到想要的結(jié)果,就要這樣寫了吧:
myObject.getValue=function(){ let self=this;//用一個self保存當(dāng)前的實(shí)例對象,即myObject setTimeout(function(){ console.log(self.value); console.log(self); },0); return this.value; } console.log(myObject.getValue());
結(jié)果如下:
這又讓我想起來了es6中箭頭函數(shù)的妙用了(這個this綁定的是定義時所在的作用域,而不是運(yùn)行時所在的作用域;箭頭函數(shù)其實(shí)沒有自己的this,所以箭頭函數(shù)內(nèi)部的this就是外部的this)(可詳看es6教程:http://es6.ruanyifeng.com/#do...箭頭函數(shù)),如下:
var myObject={ value:100 }; myObject.getValue=function(){ // let self=this;//因?yàn)橛昧思^函數(shù),所以這句不需要了 setTimeout(()=>{ console.log(this.value); console.log(this); },0); return this.value; } console.log(myObject.getValue());
執(zhí)行結(jié)果同上:
3、使用構(gòu)造器new一個對象時,this就指向新對象:
var oneObject=function(){ this.value=100; }; var myObj=new oneObject(); console.log(myObj.value);
這里的this就指向了new出來的新對象myObj,執(zhí)行結(jié)果如下:
4、apply,call,bind改變了this的指向
var myObject={ value:100 } var foo=function(){ console.log(this); console.log(this.value); console.log("..............."); } foo(); foo.apply(myObject); foo.call(myObject); var newFoo=foo.bind(myObject); newFoo();
foo本來指向全局對象window,但是call,apply和bind將this綁定到了myObject上,所以,foo里面的this就指向了myObject。執(zhí)行代碼如下:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/85209.html
摘要:應(yīng)用的四種請求數(shù)據(jù)模式翻譯原文出處鄙人翻譯略差,別見笑。每個都有自己的利弊,應(yīng)根據(jù)要求進(jìn)行判斷。二組件在使用框架時,組件負(fù)責(zé)管理自己的請求和獨(dú)立狀態(tài)。相反,將初始應(yīng)用程序狀態(tài)注入頁面的內(nèi)聯(lián)腳本中,以便應(yīng)用程序作為全局變量在需要時可用。 Vue.js應(yīng)用的四種AJAX請求數(shù)據(jù)模式 翻譯原文出處:4 AJAX Patterns For Vue.js Apps 鄙人翻譯略差,別見笑。 如果...
摘要:本文主要選取了這篇文章中的一小部分來說明一下中產(chǎn)生內(nèi)存泄漏的常見情況對于較難理解的第四種情況參考了一些文章來進(jìn)行說明意外的全局變量中如果不用聲明變量該變量將被視為對象全局對象的屬性也就是全局變量上面的函數(shù)等價于所以你調(diào)用完了函數(shù)以后變量仍然 本文主要選取了4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them 這...
摘要:如果我們在動態(tài)中用到了參數(shù)作為判斷條件,那么也是一定要加注解的,例如如下方法定義出來的如下這種情況,即使只有一個參數(shù),也需要添加注解,而這種情況卻經(jīng)常被人忽略好了,不知道大家有沒有到呢有問題歡迎留言討論。 有一些小伙伴覺得 MyBatis 只有方法中存在多個參數(shù)的時候,才需要添加 @Param 注解,其實(shí)這個理解是不準(zhǔn)確的。即使 MyBatis 方法只有一個參數(shù),也可能會用到 @Par...
摘要:這種方式和有異曲同工之處,因?yàn)槭菍ο蟮臉?gòu)造函數(shù),它的原型對象也是的方式四這種方式叫做使用對象字面量創(chuàng)建對象,這是最簡單的一種方式,也是我經(jīng)常使用的方法,目的是在于簡化創(chuàng)建包含大量屬性的對象的過程。 關(guān)鍵字 Object.create; new Object(); new Fn(); {} 背景 此段可跳過不讀……在平時的使用中,創(chuàng)建對象最常用的方式是使用{}直接創(chuàng)建,里面直接寫方法和屬...
摘要:在組件中,每個方法的上下文都會指向該組件的實(shí)例,即自動綁定為當(dāng)前組件而且還會對這種引用進(jìn)行緩存,以達(dá)到和內(nèi)存的最大化。 在react組件中,每個方法的上下文都會指向該組件的實(shí)例,即自動綁定this為當(dāng)前組件,而且react還會對這種引用進(jìn)行緩存,以達(dá)到cpu和內(nèi)存的最大化。在使用了es6 class或者純函數(shù)時,這種自動綁定就不復(fù)存在了,我們需要手動實(shí)現(xiàn)this的綁定以下是幾種綁定的方...
閱讀 1332·2021-11-15 18:14
閱讀 3306·2021-08-25 09:38
閱讀 2739·2019-08-30 10:55
閱讀 2795·2019-08-29 16:39
閱讀 1372·2019-08-29 15:07
閱讀 2506·2019-08-29 14:14
閱讀 877·2019-08-29 12:36
閱讀 976·2019-08-29 11:21