国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

一次阿里面試后對(duì)函數(shù)本質(zhì)的理解

jeyhan / 2325人閱讀

摘要:函數(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

相關(guān)文章

  • 一次阿里面試后對(duì)函數(shù)本質(zhì)理解

    摘要:函數(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操作...

    liuyix 評(píng)論0 收藏0
  • 一次阿里面試后對(duì)函數(shù)本質(zhì)理解

    摘要:函數(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操作...

    superw 評(píng)論0 收藏0
  • 刷到就是賺到!八月阿里 Android 高級(jí)崗面經(jīng)(年薪百萬(wàn))

    摘要:前段時(shí)間,前同事跳槽,機(jī)緣巧合下面了阿里,本來(lái)憑著試一試的態(tài)度,卻不料好事成雙,拿到了,而且薪資也了。面就沒(méi)啥東西可聊的,基本上就是對(duì)此次面試的一個(gè)評(píng)價(jià)定薪等等一些之內(nèi)的話題。如果是現(xiàn)場(chǎng)面試,記得關(guān)注當(dāng)天的天氣,提前查一下路線。 ...

    aisuhua 評(píng)論0 收藏0
  • 阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(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)始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • 一次慘烈阿里面試經(jīng)歷

    摘要:當(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ǔ)花香的日子。于是我決定在逛街中感受...

    Eastboat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

jeyhan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<