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

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

写在前面

  • 环境:阿里的在线编程系统允许面试官在线考察面试者的编程能力.
  • 考点:编程和理论.
    • 编程:分为技术自驱力、异步操作、编程风格(颗粒小)、变量作用域、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.cnblogs.com/jlfw/p/12513958.html

时间: 2024-11-05 14:41:26

一次阿里面试后对函数本质的理解的相关文章

刷《一年半经验,百度、有赞、阿里面试总结》·手记

在掘金上看到了一位大佬发了一篇很详细的面试记录文章-<一年半经验,百度.有赞.阿里面试总结>,为了查漏补缺,抽空就详细做了下.(估计只有我这么无聊了哈哈哈) 有给出的或者有些不完善的答案,也尽力给出/完善了(可能有错,大家自行辨别).有些很困难的题目(例如实现Promise),附带相关链接(懒癌患者福利). 总的来说,将这些题目分成了"Javascript"."CSS"."浏览器/协议"."算法"和"We

阿里面试应该注意什么?通过5轮面试的阿里实习生亲述

很多做java开发的小伙伴都会对大厂有一种敬畏之心,觉得进大厂就是鲤鱼跃龙门了,所以很多人不敢轻易的向大厂投简历.但是你知道吗?进大厂的黄金期也就是你刚毕业的一两年之内,这个时候一般不会对你的技术不会有太高的要求,工作越久反而要求越高. 我们鲁班学院是在腾讯课堂上针对Java高级开发授课的在线直播教学的学习机构,接触到的学员也是比较多的.所以这里特别采访了一名刚拿到阿里offer的学员,是如何通过阿里的5次面试的.希望能够帮助到更多想进大厂的小伙伴.(为了方便阅读,接下来我们称这名学员为"阿七&

阿里面试 Java 都问什么?万字总结!

作者:rhwayfunn blog.csdn.net/u011116672/article/details/50991618 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试.在这里分享一下自己的面试经验和学习总结.希望能够帮助更多的小伙伴. 我本科毕业于中南大学信管专业,真正开始学习Java是在大三下学期,研究生就读北航的移动云计算专业. 刚开始也是小白,也是一步步成成起来的.需要提的一点是,你将来是需要靠这个吃饭的,所以请对找工作保持十二分的热情,而且越早准备越好. 阿里

透过WebGL 3D看动画Easing函数本质

50年前的这个月诞生了BASIC这门计算机语言,回想起自己喜欢上图形界面这行,还得归功于当年在win98下用QBASIC照葫芦画瓢敲了一段绘制奥运五环的代码,当带色彩的奥运五环呈现在自己面前时我已知道自己这辈子要走的路了.在这个忘本逐新的年代不见多少媒体提及这影响了几代人的BASIC语言的50年庆了. 如今消费者对用户体验的高要求,以远不能以静态平面图形打动人心,动画已是衡量前端产品用户体验不可忽视的重要因素,最近Facebook开源的Pop动画框架已发了iOS业界极大的关注,其实Apple早在

阿里面试回来,想和Java程序员谈一谈(转载)

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上

面试后的小尝试(linux下.so共享文件的创建)

昨天,参加了一场笔试和面试.对于我这个初入软件,想要转行的名符其实的“菜鸟”来说,打击不少,几个月的“苦读”,原以为基本知识涉猎的差不多的我,迎来了一次真正的笔试与面试.两个小时的笔试,对于我来说,内容有些难度,涉及到一些数据结构的知识,也让只会看书,疏于“上机”的我感到一片茫然.毕竟,理念到实践的转换与成熟运用需要真枪实弹的练习,而我只是学会了“纸上谈兵”.具体的细节,待我把所有的相关的知识梳理好之后再发一篇博文.面试的大哥问了我关于.so文件的内容,我真心不太懂,回家的路上我一直在考虑这个问

阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上

聊聊阿里面试的三个层次!

最近去阿里的菜鸟国际做了一次面试交流,发现大公司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导.虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法.但从面试中,其实可以看得出来现在的公司对于面试者的知识体系要求.如果我们能在工作中就按着这样的要求去不断提升,那么在面试的时候必然也能游刃有余. 一般来说,阿里的面试会有两轮的技术电面,分别交叉检验你的技术基础.后面还有两轮的现场技术面试,主要检验你的项目经验.但从知识体系的角度来看,阿里面试对于

【阿里面试系列】Java线程的应用及挑战

文章简介 上一篇文章[「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景]我们了解了进程和线程的发展历史.线程的生命周期.线程的优势和使用场景,这一篇,我们从Java层面更进一步了解线程的使用.关注我的技术公众号[架构师修炼宝典]一周出产1-2篇技术文章.Q群725219329分享并发编程,分布式,微服务架构,性能优化,源码,设计模式,高并发,高可用,Spring,Netty,tomcat,JVM等技术视频. 内容导航 并发编程的挑战 线程在Java中的使用 并发编程的挑战 引入多线程的目的