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