摘要:函數(shù)使用函數(shù)的使用主要有兩種閉包閉包的本質(zhì)是對(duì)共享變量的操作,典型運(yùn)用是觀察者模式備忘錄模式普通封裝,復(fù)用。參考阿里博客你可能不知道的事基礎(chǔ)篇總結(jié)要寫(xiě)好一個(gè)項(xiàng)目需要兼容,性能,安全等。
一次阿里面試后對(duì)函數(shù)本質(zhì)的理解 寫(xiě)在前面
環(huán)境:阿里的在線編程系統(tǒng)允許面試官在線考察面試者的編程能力.
考點(diǎn):編程和理論.
編程:分為技術(shù)自驅(qū)力、異步操作、編程風(fēng)格(顆粒小)、變量作用域、DOM操作等.
理論:性能優(yōu)化,瀏覽器運(yùn)行機(jī)制,協(xié)議/標(biāo)準(zhǔn)等
本文側(cè)重于編程,在編程中對(duì)函數(shù)的運(yùn)用是寫(xiě)好程序的基礎(chǔ)。(參考開(kāi)發(fā)者技能修煉的五個(gè)等級(jí)中“第二階梯:Developer,開(kāi)發(fā)工程師”“知道了變量、邏輯與函數(shù)的意義”)
拋出一個(gè)問(wèn)題如何寫(xiě)一個(gè)信號(hào)燈?(參考一道關(guān)于Promise應(yīng)用的面試題)
那么如何寫(xiě)好一個(gè)信號(hào)燈?
我們首先發(fā)散一下思維:promise,yield,async/await(ES7)。好的,技術(shù)點(diǎn)有了,那接下來(lái)該選擇哪個(gè)方式呢?
不妨就選擇Promise,和其他方式做個(gè)對(duì)比。
對(duì)比技術(shù)點(diǎn)唉,一上來(lái)就看到async/await是ES7的特性,新生代的佼佼者,Promise已無(wú)用武之地?(參考Async/Await替代Promise的6個(gè)理由)
那我們還是先來(lái)看看有沒(méi)有挽回余地(對(duì)promise多少有些感情了)?
2.錯(cuò)誤處理
文中錯(cuò)誤處理一點(diǎn)說(shuō)到“Async/Await讓try/catch可以同時(shí)處理同步和異步錯(cuò)誤。在下面的promise示例中,try/catch不能處理JSON.parse的錯(cuò)誤,因?yàn)樗赑romise中。我們需要使用.catch,這樣錯(cuò)誤處理代碼非常冗余。并且,在我們的實(shí)際生產(chǎn)代碼會(huì)更加復(fù)雜。”
我們想想問(wèn)題根源應(yīng)該是每步都需要catch,那將then中的函數(shù)統(tǒng)一放入數(shù)組,然后遞歸運(yùn)行可以解決這個(gè)問(wèn)題。(另外,參考Toxicity:這些關(guān)鍵字有毒里面有說(shuō)到eval with try/catch對(duì)性能有一定的影響)
3.條件語(yǔ)句
文中說(shuō)到“需要獲取數(shù)據(jù),然后根據(jù)返回?cái)?shù)據(jù)決定是直接返回,還是繼續(xù)獲取更多的數(shù)據(jù)。”
我們可以適當(dāng)通過(guò)reject("")解決的,記得最后一定要有一個(gè)catch((err) => console.log(""))。等等那是和上面沖突了(每步catch)。這樣使用裝飾者模式對(duì)函數(shù)再wrapper。
4.中間值
文中提到“你很可能遇到過(guò)這樣的場(chǎng)景,調(diào)用promise1,使用promise1返回的結(jié)果去調(diào)用promise2,然后使用兩者的結(jié)果去調(diào)用promise3?!?/p>
我們使用觀察者模式解決。
6.調(diào)試
文中提到“最后一點(diǎn),也是非常重要的一點(diǎn)在于,async/await能夠使得代碼調(diào)試更簡(jiǎn)單。2個(gè)理由使得調(diào)試Promise變得非常痛苦”
我們也通過(guò)遞歸和 將要執(zhí)行的函數(shù)放入一個(gè)數(shù)組解決。
對(duì)Promise幾個(gè)主要缺點(diǎn)找到了補(bǔ)償措施,就可以進(jìn)行編碼實(shí)現(xiàn)了。(當(dāng)然我們還是要擁抱新特性的)
變量命名export function singalLamp(singalArr) { }
大家都知道對(duì)比typeScript,JS是動(dòng)態(tài)+弱類(lèi)型(動(dòng)弱無(wú)關(guān))。那么變量命名就需要在表達(dá)清邏輯的同時(shí)攜帶變量類(lèi)型。好的代碼是盡量通過(guò)命名讓用戶理解和使用。(畢竟同時(shí)維護(hù)大量文檔和代碼是個(gè)難事)
總結(jié)一句就是:駝峰+邏輯+類(lèi)型。
參數(shù)使用var doSomething = function(obj) { var _adapter = { name : "xioaming", titile : "xiaoming", age : 24, color : "pink", size : 100 } for (var i in _adapter) { _adapter[i] = obj[i] || _adapter[i]; } //dosomething }
export function signalLight(data) { const sign = data.slice(); }
對(duì)傳入的參數(shù)應(yīng)該盡量拆卸,以免用戶傳參屬性變更。(屬性較多時(shí),考慮使用適配器模式)
變量的使用應(yīng)盡力保證函數(shù)是純函數(shù)。對(duì)傳參deepClone/slice,不修改外部變量。
函數(shù)聲明export function singalLamp(singalArr) { function tic(singal, time) { return () => new Promise((res) => setTimeout(() => { console.log(singal); res(); }, time)); } const rawArr = singalArr.slice(); }
函數(shù)的聲明/定義有A:function test() {} ; B:const test = function() {}; C:const test = () => {},那么他們有神么區(qū)別?
A方式:函數(shù)會(huì)提升,提升意味著在該作用域(scope)任何位置都可以使用。知道了這些,我們可以得出一個(gè)結(jié)論:使用該方式函數(shù)必須是純函數(shù)。
B/C方式:函數(shù)不會(huì)提升,此種方式一般定義一個(gè)非純函數(shù),非純函數(shù)(這里指依賴(lài)于外部的變量)提升了也沒(méi)有意義。因?yàn)樗蕾?lài)于上下文,即調(diào)用變量的初始化。
C方式:C方式中是一個(gè)箭頭函數(shù),不免讓我們思考為什么箭頭函數(shù)沒(méi)有function test() {}這種會(huì)提升的定義方式呢? 答案是箭頭函數(shù)自身的特性(this指向依賴(lài)詞法/靜態(tài)作用域),這使得箭頭函數(shù)的提升沒(méi)有意義。
函數(shù)使用export function singalLamp(singalArr) { function tic(singal, time) { return () => new Promise((res) => setTimeout(() => { console.log(singal); res(); }, time)); } const rawArr = singalArr.slice(); const lampArr = rawArr.reduce(function(prev, item) { return prev.concat([tic(item, 1000)]); }, []); const step = function(iterator) { if (iterator === lampArr.length) { return step(0); } else { return () => lampArr[iterator]().then(step(++iterator)); } } step(0)(); } singalLamp(["red", "green", "yellow"]);
函數(shù)的使用主要有兩種:
閉包
閉包的本質(zhì)是(對(duì)共享變量的操作,典型運(yùn)用是觀察者模式/備忘錄模式)
普通
封裝,復(fù)用。(當(dāng)我門(mén)對(duì)一段邏輯不需要復(fù)用時(shí),我們?nèi)詫⑺鼘?xiě)成函數(shù)的動(dòng)機(jī)是:細(xì)顆粒化邏輯)
性能優(yōu)化在Web開(kāi)發(fā)過(guò)程中,可以進(jìn)行性能優(yōu)化的方面多如牛毛,筆者在這里介紹幾處切合本文主題的優(yōu)化方式。即js的高性能代碼書(shū)寫(xiě)(參考編寫(xiě)高性能的JS代碼),這里簡(jiǎn)單說(shuō)幾個(gè):
i++與++i
使用前綴自增表達(dá)式,也能帶來(lái)小小的性能提升。(++i代替i++)
閉包
雖然上文介紹了閉包的實(shí)用性,但是還是應(yīng)該盡量避免使用閉包,它就和remove dom一樣讓人詬病。(垃圾回收問(wèn)題,內(nèi)存)
const與let
就 let 而言,他的使用場(chǎng)景應(yīng)該是相對(duì)較少的,我們只會(huì)在 loop(for,while 循環(huán))及少量必須重定義的變量上用到他。
猜想:就執(zhí)行效率而言,const 由于不可以重新賦值的特性,所以可以做更多語(yǔ)法靜態(tài)分析方面的優(yōu)化,從而有更高的執(zhí)行效率。(參考阿里FED博客ES6 你可能不知道的事 - 基礎(chǔ)篇)
總結(jié)要寫(xiě)好一個(gè)項(xiàng)目需要兼容,性能,安全等。寫(xiě)好一個(gè)功能需要設(shè)計(jì)模式和解耦需求。寫(xiě)好一個(gè)函數(shù)需要考慮["對(duì)比技術(shù)點(diǎn)","變量命名","參數(shù)使用","函數(shù)聲明","函數(shù)使用"].join("+");
其他個(gè)人博客歡迎交流共勉成長(zhǎng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/50681.html
摘要:函數(shù)使用函數(shù)的使用主要有兩種閉包閉包的本質(zhì)是對(duì)共享變量的操作,典型運(yùn)用是觀察者模式備忘錄模式普通封裝,復(fù)用。參考阿里博客你可能不知道的事基礎(chǔ)篇總結(jié)要寫(xiě)好一個(gè)項(xiàng)目需要兼容,性能,安全等。 一次阿里面試后對(duì)函數(shù)本質(zhì)的理解 寫(xiě)在前面 環(huán)境:阿里的在線編程系統(tǒng)允許面試官在線考察面試者的編程能力. 考點(diǎn):編程和理論. 編程:分為技術(shù)自驅(qū)力、異步操作、編程風(fēng)格(顆粒小)、變量作用域、DOM操作...
摘要:函數(shù)使用函數(shù)的使用主要有兩種閉包閉包的本質(zhì)是對(duì)共享變量的操作,典型運(yùn)用是觀察者模式備忘錄模式普通封裝,復(fù)用。參考阿里博客你可能不知道的事基礎(chǔ)篇總結(jié)要寫(xiě)好一個(gè)項(xiàng)目需要兼容,性能,安全等。 一次阿里面試后對(duì)函數(shù)本質(zhì)的理解 寫(xiě)在前面 環(huán)境:阿里的在線編程系統(tǒng)允許面試官在線考察面試者的編程能力. 考點(diǎn):編程和理論. 編程:分為技術(shù)自驅(qū)力、異步操作、編程風(fēng)格(顆粒小)、變量作用域、DOM操作...
摘要:前段時(shí)間,前同事跳槽,機(jī)緣巧合下面了阿里,本來(lái)憑著試一試的態(tài)度,卻不料好事成雙,拿到了,而且薪資也了。面就沒(méi)啥東西可聊的,基本上就是對(duì)此次面試的一個(gè)評(píng)價(jià)定薪等等一些之內(nèi)的話題。如果是現(xiàn)場(chǎng)面試,記得關(guān)注當(dāng)天的天氣,提前查一下路線。 ...
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...
摘要:當(dāng)我們的需求出現(xiàn)變動(dòng)時(shí),工廠模式會(huì)需要進(jìn)行相應(yīng)的變化??偨Y(jié)來(lái)說(shuō),要想成功進(jìn)行一次阿里巴巴的面試,你需要了解甚至掌握以下內(nèi)容語(yǔ)言,尤其是線程原理數(shù)據(jù)庫(kù)事務(wù),加鎖,重點(diǎn)分布式設(shè)計(jì)模式可以說(shuō)是涉及范圍非常廣了。 showImg(https://segmentfault.com/img/bV8cSY?w=576&h=432); 前言 今天本是一個(gè)陽(yáng)光明媚,鳥(niǎo)語(yǔ)花香的日子。于是我決定在逛街中感受...
閱讀 1288·2023-04-25 19:33
閱讀 1170·2021-10-21 09:39
閱讀 3644·2021-09-09 09:32
閱讀 2613·2019-08-30 10:58
閱讀 1598·2019-08-29 16:17
閱讀 873·2019-08-29 15:29
閱讀 2884·2019-08-26 11:55
閱讀 2657·2019-08-26 10:33