资讯专栏INFORMATION COLUMN

一次阿里面试后对函数本质的理解

jeyhan / 2217人阅读

摘要:函数使用函数的使用主要有两种闭包闭包的本质是对共享变量的操作,典型运用是观察者模式备忘录模式普通封装,复用。参考阿里博客你可能不知道的事基础篇总结要写好一个项目需要兼容,性能,安全等。

一次阿里面试后对函数本质的理解 写在前面

环境:阿里的在线编程系统允许面试官在线考察面试者的编程能力.

考点:编程和理论.

编程:分为技术自驱力、异步操作、编程风格(颗粒小)、变量作用域、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("+");

其他

个人博客欢迎交流共勉成长

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/50681.html

相关文章

  • 一次阿里面试后对函数本质理解

    摘要:函数使用函数的使用主要有两种闭包闭包的本质是对共享变量的操作,典型运用是观察者模式备忘录模式普通封装,复用。参考阿里博客你可能不知道的事基础篇总结要写好一个项目需要兼容,性能,安全等。 一次阿里面试后对函数本质的理解 写在前面 环境:阿里的在线编程系统允许面试官在线考察面试者的编程能力. 考点:编程和理论. 编程:分为技术自驱力、异步操作、编程风格(颗粒小)、变量作用域、DOM操作...

    liuyix 评论0 收藏0
  • 一次阿里面试后对函数本质理解

    摘要:函数使用函数的使用主要有两种闭包闭包的本质是对共享变量的操作,典型运用是观察者模式备忘录模式普通封装,复用。参考阿里博客你可能不知道的事基础篇总结要写好一个项目需要兼容,性能,安全等。 一次阿里面试后对函数本质的理解 写在前面 环境:阿里的在线编程系统允许面试官在线考察面试者的编程能力. 考点:编程和理论. 编程:分为技术自驱力、异步操作、编程风格(颗粒小)、变量作用域、DOM操作...

    superw 评论0 收藏0
  • 刷到就是赚到!八月阿里 Android 高级岗面经(年薪百万)

    摘要:前段时间,前同事跳槽,机缘巧合下面了阿里,本来凭着试一试的态度,却不料好事成双,拿到了,而且薪资也了。面就没啥东西可聊的,基本上就是对此次面试的一个评价定薪等等一些之内的话题。如果是现场面试,记得关注当天的天气,提前查一下路线。 ...

    aisuhua 评论0 收藏0
  • 阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • 一次惨烈阿里面试经历

    摘要:当我们的需求出现变动时,工厂模式会需要进行相应的变化。总结来说,要想成功进行一次阿里巴巴的面试,你需要了解甚至掌握以下内容语言,尤其是线程原理数据库事务,加锁,重点分布式设计模式可以说是涉及范围非常广了。 showImg(https://segmentfault.com/img/bV8cSY?w=576&h=432); 前言 今天本是一个阳光明媚,鸟语花香的日子。于是我决定在逛街中感受...

    Eastboat 评论0 收藏0

发表评论

0条评论

jeyhan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<