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