精华内容
下载资源
问答
  • 后端深奥,看了书也很难理解,而且学习周期长,QAQ,以前学过前端,讲简单的前端知识才有把握,至于后端,只有平时和技术人员交流时才能了解。 ####后台服务之RPC框架 后台的作用就是提供服务,按客户端的要求,将...

    后端深奥,看了书也很难理解,而且学习周期长,QAQ,以前学过前端,讲简单的前端知识才有把握,至于后端,只有平时和技术人员交流时才能了解。

    ####后台服务之RPC框架
    后台的作用就是提供服务,按客户端的要求,将业务数据回吐给请求者。
    后端涉及技术栈非常多但其核心技术是RPC(远程过程调用,“过程”可看做提供服务的方能发或称函数)
    网络的各种服务(如导航,天气)都运行在后台服务器上,这样终端便弱化为了一个展示数据的工具。后台服务往往跑在一个异构系统上(客户端是Android和iOS,服务端是Linux),它们在地理位置上也不存在进程间通信那样便利,为了解决这个问题,RPC应运而生,有了它调用一个远程服务就像调用一个本地服务一样简单,RPC是封装起来的,这便是RPC框架

    ####RESTfulAPI
    API:比如后台老王开发了一个好友管理系统,并且写了一套API,具体有有加好友add_friends,删除好友delete_friends。这样,前端人员想要调用他的API只需访问不同的URL,比如加好友:htt…con/add_friends.php。这样后台就可以知道前端想调用的功能,并且把想要的数据返回给前端,但这种方式在一定情况加会导致URL越来越长,降低可读性,于是REST风格便出现:
    首先,服务器上的东西,都要通过URL暴露出来,这样URL便成为了:htt…com/friends,然后HTTP提供了GET,POST,PUT,DELETE四个动词。这样想要删除好友,就可以用DELETE访问friends,这样服务器就可以根据URL,并且识别不同动词,区分前端想干什么。

    ####Session
    情景:小明经常去一家酒吧喝酒,去了三次,但店员不记人,这样小明相对于店员就是三个人。但后来,酒吧给每个顾客发了张名为SessionID的卡,以后小明去酒吧,店员就可以说“你又来了”。
    Session即为一种机制,给用户分配一个身份,从而完成对用户的识别,将用户多次不同操作联系在一起。
    实例:比如你在京东(京东没有给我钱)买了三件东西,但后台并不知道这三件东西是你一个人买的,但通过Session机制,就可以将其联系在一起。

    ####后台服务之流量控制
    比如双十一,用户流量都会成百上千的增加,哪个模块扛不住便会导致系统崩溃,影响用户正常使用,故,后台需要考虑流量控制,当流量达到一定极限时,引流到其他服务或者拒绝服务,以保持服务可用性。
    一般方式有“漏铜算法”和“令牌桶算法”来解决。

    ####后台服务之生成唯一ID
    常见方法有1.数据库2.UUID3,雪花算法。

    展开全文
  • 随着互联网的高速发展以及IT开发技术的升级,前后端分离已成为互联网项目开发的业界标准使用方式。在实际工作中,前后端的接口联调对接工作量占Web前端人员日常工作的30%-50%,甚至会更高。接下来就给大家讲解前后端...

    随着互联网的高速发展以及IT开发技术的升级,前后端分离已成为互联网项目开发的业界标准使用方式。在实际工作中,前后端的接口联调对接工作量占Web前端人员日常工作的30%-50%,甚至会更高。接下来就给大家讲解前后端分离接口。

    为什么要前后端分离?

    把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署。两个不同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发。开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。
    在这里插入图片描述

    前后端分离的优点是什么?

    1、彻底解放前端。前端不再需要向后台提供模板或是后台在前端HTML中嵌入后台代。

    2、提高工作效率,分工更加明确。前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的JSON文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。

    3、局部性能提升。通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。

    4、降低维护成本。通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。

    5、实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。

    6、即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。

    7、可以使后台能更好的追求高并发、高可用、高性能,使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。

    前端工程是如何调用接口?

    Ajax在浏览器与Web服务器之间使用异步数据传输(HTTP 请求),通过get或者post方法与服务器交互。

    前端和后端之所以需要对接,是因为前端页面只负责提供视图没有内容,而后端只提供内容,两者所谓的对接,就是把后端的内容放在前端页面预留出来的位置上。(虽然说是前端后端 ,但这一对接实际发生在服务器端)。

    所以服务器端进行的交互活动如下:

    接收用户请求——》找到负责处理的程序——》处理程序找到要传输给用户的前端页面——》该前端页面留出位置——》后端到数据库取数据——》后端把数据放在前端留出来的位置上

    ——》结合成真正用户看到的HTML文件——》传输给用户。

    如果你想了解更多前后端分离相关的知识点,可以关注我,定期发布技术热点和行业趋势分析。

    展开全文
  • 从面试官的角度分享一些后端校招经验

    万次阅读 多人点赞 2018-07-01 16:24:46
    本来我也就是刚开始学着当面试官,不该妄谈经验,但是因为最近换了一份工作,未来几年都不会再有国内互联网公司的校招经验了,所以不如趁热分享一下,省得知识过期。本文是个人体会,而且经验不多,读者姑妄听之就好...

    1. 写在前面

    写在前面
    我从去年年初开始在美团当校招面试官,参加了 17 届春招和 18 届秋招两届面试,总共就面试了五十多个人。本来我也就是刚开始学着当面试官,不该妄谈经验,但是因为最近换了一份工作,未来几年都不会再有国内互联网公司的校招经验了,所以不如趁热分享一下,省得知识过期。本文是个人体会,而且经验不多,读者姑妄听之就好,不必太认真。

    这篇文章主要针对的是徘徊在 offer 线上下的同学,因为作为面试中的初试官,也在这部分同学上花心思比较多,如何保证通过的质量、如何保证面试的公平性等等,明显能通过的同学反而不用花太多心思,offer 的定级交给复试官就好。文章中会用校招圈子的通用标准来描述 offer 等级:批发价、SP、SSP。更高的等级(例如阿里星)就不讨论了,拿到 SSP 的候选人我都没见过几个。

    开始之前也必须声明一下, 面试是一件随机性很大的事情(PS:之前听过一个准备华为面试的讲座分享,讲座上就提到过很多大公司就像华为一样都有专门的面试团队。另外建议大家在面试一个公司的时候了解一下这个公司到底是不是适合自己、了解一下这个公司的价值观。最好不要海投!!!) 。看学生的帖子经常会说某个公司的面试是什么样的,但是其实面试的标准每个人都不同,面试官会用自己的方法去评估一个人在不同维度上的分数。在实际操作中,公司很难通过培训等手段统一整个公司的面试标准。一个组、或者是公司派往一个城市的面试团队之间倒是有可能通过不断磨合来统一标准。反过来说,整个互联网圈子由于人员流动太快,公司之间的面试体系差异倒是不大,一个面试官可能今年在百度,明年在阿里,他会用同样的体系去评估候选人,然后根据公司的标准去选择录取线。

    这里写图片描述

    在面试的时候,面试团队会尽量统一标准。不同的团队由于负责人的偏好可能会有不同的倾向、比如有的团队会看重潜力、看重学习能力,另外一个团队则看重基础知识,要求录取的同学基础必须扎实。因为标准不同,一个公司派往一个城市的两个团队可能会给一个同学给出不同的结果。所以我认为,在后端技术面试体系(而不是招聘流程)的角度谈公司意义不大。最近几年校招同学在论坛上对面试官的评价和讨论越来越多,面试官出言不慎很容易给公司惹事,因此公司往往要求面试官少给学生反馈。我看到很多同学面试几场下来,只知道面试官问了什么问题,却对面试官如何从这些问题中勾勒出一个候选人的知识结构毫无概念,也不知道自己再哪些方面有缺陷,希望本文能给你提供一个不一样的视角,学会从面试官的角度思考如何提问,如何评估候选人的水平。

    2. 如何获取面试机会

    这里写图片描述
    获取面试机会,也就是投递简历,通常就是三种渠道:内推、网申和霸面。

    各个公司都会给内推多一点机会,有的承诺不需要笔试,有的不承诺但是通过机会也比网申大一些,总之尽量找人内推。但是内推也不是一定能得到面试机会,通过 HR 筛简历之后可能面试官还要筛一次简历(或者是各个组自己从简历池里挑人,有的简历一直到最后都没被挑走)。

    网申一般需要笔试,笔试通过还需要 HR 筛选才能见到面试官。笔试现在都是网上答题,客观题就不说了,主观题(例如写代码)一般除了系统跑测试用例之外还会有面试官人工判卷。如果是算法题,面试官会判断是否最优解,如果不是最优解,即使测试用例都通过了也会扣几分。笔试的标准一般不会太高,能写出来就行,没有最优解也能拿到面试机会。

    不同公司的笔试时间难免会冲突,只能做一个,这时候选你喜欢的公司做就行了。互联网行业的校招中优秀学生的话语权很大,只要简历够好,不参加笔试也有可能得到面试机会。

    面试的当天按时到场就可以了,实在不能来可以提前问问 HR 能否改个时间面试。放鸽子确实不礼貌,不过 HR 通常也会打电话问一下原因。如果是觉得肯定通过不了,我倒觉得不妨试试,参加面试实战绝对是提高最快的方法。

    如果没有得到面试机会,去现场霸面也是可以的。提前一点到,把简历交给 HR,然后等通知。由于面试当天一般会有爽约的学生,所以也会有闲着的面试官,如果是接受霸面的公司,HR 会收集简历给面试官看一下,觉得简历不错的通常会得到面试机会,而且不会因为是霸面就提高通过标准。

    另外,几轮面试官之间会传递一些信息,例如哪方面很好,哪方面有欠缺,哪方面没问之类的。所以也不要纠结为什么某轮面试官问的方向有点奇怪,这都是为了更全面的评估候选人。

    3. 后端的知识体系

    这里写图片描述

    在校园招聘中,后端可以说是要求最宽的职位了。你如果去面试 iOS,肯定要做过 App,如果去面试前端,肯定要写过 JS,如果要面试算法,肯定要做过机器学习。但是面试后端,却不一定要做过后端。在实际面试中,我们遇到过各种专业的同学,通信、自动化已经算是关联性较高的了,化工、机械之类的工科也不少,很多同学都完全没有接触过后端开发,但是拿到了后端 offer。

    在面试中,我会按照三个方面去考察:

    1. 手写代码
    2. 计算机基础
    3. 后端开发

    3.1. 手写代码

    这里写图片描述
    一个企业无论按照什么样的标准去招软件工程师,手写代码都是基本的能力。尤其是校招的时候,应届生的项目经验不多,手写代码的重要性就更高了。但是代码题一般不会太难,像手写红黑树这种难度的题一般不会出现。

    考虑到面试时间通常都是半小时到一小时之间,手写代码的时间也不会超过 20 分钟,按照这个时间去卡,就是默写常见算法(查找、排序等等)或者简单一些,但是需要现场思考的代码,一般是 LeetCode 上的 medium 或者 easy 难度,如果 easy 难度的题都做不出来,面试官心里真的要打问号了。

    除了手写代码之外,可能会有一个不需要写代码的算法题,考察对数据结构的理解和分解问题的思路,这个的难度会大一些,也没办法估算范围,只能平时多思考了。

    3.2. 计算机基础

    这里写图片描述

    计算机基础通常指的就是考研的四门课,计组一般不会有人问,但是如果没学好计组的话操作系统、数据库之类的题可能会理解不深。另外三门课也都是计算机和软件学生应该具备的基础知识。

    数据结构的水平可能在算法题里体现出来,如果直接问的话一般不会问太难。有可能问链表和数组的区别这种热身题,也可能出二叉树前中后序遍历这种简单的动手题。

    计算机网络可以考察的内容主要集中在 TCP/IP 协议上。还可能问 DNS、七层模型之类的问题。网络这门课很多同学偏向于死记硬背,对原理性的东西掌握不足,面试的时候一般会先问是什么,然后问为什么,能把协议设计的原理讲明白才算是合格。

    操作系统主要是问进程线程模型,进程间通信,内存模型,pv 操作之类的。和计算机网络类似,这门课也有很多同学死记硬背,面试的时候一般会结合编程问,例如问 Java 中的进程线程实现之类的问题。来考察是背下来的还是真的理解。

    3.3. 后端

    这里写图片描述
    前面说面试后端可以没做过后端,但是如果做过后端的话绝对是加分项,也容易成为面试的主战场。对于面试官来说,最需要的一个就是自己非常熟悉,候选人也下过功夫的领域,这样才能提出有足够深度的问题,考察出候选人的学习能力。这部分因为不是每个人都要掌握的,所以一般是结合简历上的项目经历问,简历上写做过什么才会问什么,千万不要在简历上写自己没做过和只是打了一下酱油的项目。

    我认为属于后端的领域包括:编程语言和框架(例如 Java 语言和 Java Web 框架)、数据库、HTTP、中间件、分布式系统、系统设计和解决实际问题的能力。这里语言用 Java 做例子。

    Java 语言在语法方面可以考察的不多,很多面试官喜欢问 Java 类库的实现,比如哈希表就是一个很常见的题,可以问 HashTable, HashMap 的区别,如果需要并发的话怎么办,ConcurrentHashMap 的实现原理,HashMap 在 JDK 不同版本的演进,何时从链表换成红黑树等等。如果要在简历上写熟悉 Java 的话,最好把常用的数据结构代码都读一下。此外,多线程、垃圾回收也是非常常见的问题,多看面经的都知道,不再赘述。

    Java Web 大家熟悉的一般是 SSH,如果有 Spring MVC, MyBatis, SpringBoot 的知识也很好。这套技术栈面试官一般都很熟悉,候选人的水平是简单的照着视频做过一遍开发,还是深入了解过框架的原理,甚至自己试着仿制和修改过框架,都很容易考察出来。

    数据库主要指的是 MySQL 这样的关系型数据库。大家在学校里一般都学过数据库原理,比如索引的数据结构、三范式。在实践中一般也做过索引优化,选一两个例子问原理,还可以考察对数据结构的理解。

    HTTP 对于做过网站的同学应该都熟悉,尤其是有的同学简历上还写熟悉 RESTful,可以问的问题都很多,比如 GET POST 的区别可以很容易的看出学习的深度。另外 Session 和 Cookie 也是非常好的考察点,是照着视频搭的网站还是自己研究过,研究的多深一问就明白了。在我的经验中,只有一半做过 Web 的候选人知道 Session 是依赖 Cookie 实现的。

    中间件和分布式系统一般是实习过的同学才会问到。应届生可能理解不会太深,但是还是有很明显的区分度。例如 Redis 很多人都会写到简历上,有的同学只是会调接口,有的同学知道接口后面是怎么实现的,还有的同学不但知道实现,还思考过原理,能讲出来为什么要这么做。

    系统设计是很好的题目,聊起来轻松,就是有些费时间,不管候选人的水平怎么样都能花掉 10 到 20 分钟。有时候前面能问的很深入,就没有时间做系统设计,也有简历太简单,没什么可问的,就问两个系统设计凑够时间。我出系统设计题一般是描述一个简单的系统,如果是业务系统,让候选人写出数据库表就可以了,如果是性能要求比较高的系统,可能会涉及到对中间件的使用和 sharding。系统设计中可以考察的点就多了,能否考虑到一致性、幂等、冗余、横向扩展、未来需求、搜索、统计等等的需求都可以体现出来。

    最后可能还会注意到项目中一些比较难的问题,让候选人复述当时是怎么做的,如果问题很通用的话,还可以增加条件,让问题变得更复杂,现场思考解决方案。这些都是很难提前准备的,但是如果解决问题的时候做过足够多的调研和思考,在面试的时候都能反映出来。

    4. 通过的标准

    这里写图片描述
    在上述的知识范围中,如何确定一个候选人是否通过、和给什么等级的 offer 呢?我相信每个公司都为确立标准和统一标准费尽了心思。但是最后落到面试官手里的并不是一个包罗万象的打分表,而是前后几轮面试官在沟通一个个候选人的评价时形成的感觉。

    在标准的确立上,有的 leader 会非常看重候选人的学习能力,只要表现出来很强的学习能力,就算基础知识很差也可以。还有的 leader 要求基础必须好,就算很聪明,对计算机基础没有足够的了解也不行。如果想多收 offer,而不是碰运气捡一两个 offer 的话,最好能把自己的短板都补齐,在所有的领域都做到有基础,然后有突出的优点。

    手写代码是最最基本的要求,面试软件工程师不写代码肯定是不行的,但是不同的面试官也有不同的要求。有些公司的面试会让候选人手写二分查找,冒泡排序之类的,作为正在找工作的应届生,很多人都会把常见的查找和排序算法背下来,所以考察效果一般。

    面试官一般都有自己得题库,我也是会准备几道题,上来会先写一个单向链表空间复杂度 O(1) 的翻转,这道题应该说足够简单,从我的经验看,80% 的人都能写出来,写不出来的话如果还有时间可能会再出一道简单的题,两道题都写不出来就可以找题目杀时间了。第一道题写出来就会再出一道稍微难一些的题,如果两道题都能写出来,代码就算合格了。第二道题一般有很多种解法,也有一些扩展问题,如果思路很清晰,能直接找到最好的解法,扩展问题也回答的很好,在代码部分就算是表现优秀。如果思路不是很清楚,但是经过提示之后想到了方法,这轮只能算是勉强过关。

    一般的后端面试,写代码都不会出很难的题,一来时间有限,太难就没办法问别的了。二来比较难的算法题,思路都十分的精巧,面试的时候能做出来的人,大部分都是刷题的时候做过,而不是水平高到能在几分钟之内想出来。其实在后端开发中,只要对常见的数据结构理解充分,能够灵活应用就够了。

    计算机基础知识的三个方面,学计算机的同学通常都了解的不错,跨专业的同学在这方面可能会适当放宽,但是也不能一无所知。一般数据结构是必须掌握的,操作系统和网络如果没学过可以不了解。

    举一个例子:TCP 建立和断开连接的过程候选人一般都能写出来。写出来之后我会问,为什么 TCP 断开连接要比建立连接多一次操作?这个问题听起来很傻,但是不是所有人都能答出来。如果这个问题回答不出来,可以说 TCP 的知识只是死记硬背的,根本不理解。还有一个知识点是 2MSL,知道这个时间是怎么推算出来的,差不多就是所有候选人中的前 30% 了。

    除了手写代码和计算机基础,剩下的方面都是可选项,很多硕士应届生,研究生期间和导师做某个方向的研究,从来没写过后端应用,那只要基础知识很扎实,研究做的也不错就可以了。还有一些同学正好相反,基础知识比较差,但是动手能力很强,自己做过许多东西,这类就要求关于项目的问题回答的很好,表现出很强的自学能力才能通过。

    项目的问题我举个例子,如果一个同学做过微信公众号的支付部分,那我会让他画一下微信支付的流程图,然后问从微信的角度考虑,设计流程时,如何防止用户篡改价格,如何防止重复支付,如果网络连接断开了,怎么获取支付结果,如何防止重放攻击等等。真的做过项目的同学,至少流程图是能画出来的,但是这远远不够。能够从微信支付的流程中学到支付 API 的设计思路,并且在自己设计 API 的时候能够用上,才算是学习能力强的候选人。

    代码、计算机基础、后端这三个方面都合格,或者某一方面有缺陷,但是有优势能补上的同学就能拿到批发价的 offer 了。批发价的范围很广,从刚刚及格,到能力相当全面但是没有突出亮点的同学都会拿到批发价。

    SP 根据不同公司的情况差别就很大了,有的公司求贤若渴、品牌不够或者批发价给的低,都有可能导致 SP 比较水。我在美团的时候见到的 SP 很少,很多在 BAT 拿到 SP 的同学在我们这里都没拿到。通常来说拿到 SP 的同学都有一两个大公司的实习经历,并且对自己实习时的工作非常熟悉。

    关于实习,我看到有很多同学说实习没有用,其实并不一定。实习很看公司,如果是去小科技公司改页面或者做做 CRUD,给什么任务就做什么任务,对公司的框架、技术体系、业务运转都一片模糊的话,实习的作用确实不大。但是如果有在一二线互联网公司中,深度参与到项目中的实习经历,可以在项目这部分远远超过在校园里自己做练手小项目的同学。

    要想从实习经历中表现出很强的学习能力,实习的时候一定要积极,不光交给你的任务要完成,还要努力了解整个系统的架构,最好还要知道架构设计的原因,在了解原因的时候还会触及到业务背景。实习是一次很全面的考验,勤奋的同学可能会努力干活,但是没有足够的好奇心和自我驱动力很难了解到面试官想问的那些问题。

    对于没有实习的同学,也不是没有办法,比如参加竞赛。ACM 自然最好,没有参加 ACM 的也可以参加一些比较偏向动手的比赛,我印象很深的是有一个同学参加阿里中间件竞赛,虽然没进决赛,但是讲初赛的几轮改进已经表现出很好的学习能力,在 Java、操作系统、数据结构方面都有明显的进步过程。另外还有一个同学参加微软的创业大赛做了一个 App,比一般同学练手做的 App 完成度高很多。另外,如果有兴趣,自己钻研一些开源系统也是很好的加分项,比如有些同学精读 Linux 源码,面试官问不出极限,肯定会给很高的评价。

    在面试的时候,因为要考察候选人的学习能力和自我驱动力,所以难免对计算机专业的同学的要求更高,对研究生的标准比本科生更高。同理,工作之后再考研的同学,我们也会有更高的要求,如果研究生期间只是沿着工作时的老路做些类似的系统,连技术栈都没有换,那工作经历对候选人肯定是减分项。同样在社招时,我们对候选人参加工作的时间也会有一些考虑,对于工作八九年还在做初级工作的工程师,也会考虑他是否学习能力不足。

    这篇文章写了这么多知识点,但是大部分都是在校园里会学到的内容,我也不觉得应届毕业生拿到一份年薪 20 万的 offer 是多么难的事情,至少相比其他行业 8-10k 的 offer 来说难度没有高很多。对于非计算机专业的同学,要想拿到 offer 一般都提前两三年开始准备,并且付出了很多的努力。参加三四个月的培训拿到 offer 的例子,不是没有,但是真的很少。互联网公司的面试一般超过两个小时,我不认为培训的时候教的那些技巧能够骗过面试官,所以想去一线公司的同学,最好还是早点准备,把基础学扎实了,再实实在在的做几个项目。

    感谢阅读到这里的同学,祝大家都能拿到满意的 offer~

    作者: 贝页书
    原文地址:http://ju.outofmemory.cn/entry/345963

    如果你觉得我的文章对你有帮助话,欢迎关注我的微信公众号:”Java面试通关手册“(一个有温度的微信公众号,无广告,单纯技术分享,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源。你想关注便关注,公众号只是我记录文字和生活的地方,无所谓利益。)

    我的公众号

    展开全文
  • 面向后端的前端技术分享

    千次阅读 2021-05-19 00:53:57
    点击上方“前端开发博客”关注公众号回复“2”加入前端群作者:九旬来源:SegmentFault 思否社区目的分享日常开发工作中常遇到的问题提升工作效率,编写易维护的代码了解前端技术的趋势T...

    点击上方“前端开发博客”关注公众号

    回复“2”加入前端群

    作者:九旬

    来源:SegmentFault 思否社区

    目的

    • 分享日常开发工作中常遇到的问题

    • 提升工作效率,编写易维护的代码

    • 了解前端技术的趋势

    This

    JS 关键字:指向当前环境的上下文

    1. 事件中的 this

    在 DOM 事件中,this指向当前的 DOM 元素对象。

    在 HTML 事件(仅为 addEventListener 添加时),this 指向了接收事件的 HTML 元素

    <style>
      #box {
        height: 300px;
        line-height: 300px;
        text-align: center;
      }
    </style>
    <body>
      <div id="box">Hello World</div>
      <script>
        function bluify() {
          console.log(this);
          this.style.backgroundColor = "#00CCFF";
          this.innerHTML =
            this.innerHTML === "Hello World" ? "你好,世界" : "Hello World";
        }
        box.addEventListener("click", bluify, false);
      </script>
    </body>

    2. 全局函数、匿名函数,this 指向是全局对象

    • 浏览器中指向 Window

    • Node 环境指向 Global

    function func() {
      console.log(this); // Window or global
    }
    func();
    

    3. 对象的方法调用

    this 指向当前的对象

    const xiaoming = {
      name: "小明",
      getName() {
        console.log(this.name);
      },
    };
    xiaoming.getName(); // 小明

    4. 构造函数内调用,this 指向实例对象

    function Person(name, sex, age) {
      this.name = name;
      this.sex = sex;
      this.age = age;
    }
    let xiaoming = new Person("小明", "男", 20);
    console.log(xiaoming); // { name: '小明', sex: '男', age: 20 }
    

    5. call/apply/bind 调用

    this 指向第一个参数

    const xiaoming = {
      name: "小明",
      getName() {
        console.log(this.name);
      },
    };
    const xiaohong = {
      name: "小红",
    };
    xiaoming.getName.call(xiaohong); // 小红

    this 复制引用

    原因: 用于纠正 this 指向不达预期的问题

    应用场景: 比如在 setTimeout 中的函数

    用法:let that = this;

    普通函数 VS 箭头函数

    var name = "window";
    let obj = {
      name: "obj",
      outout1() {
        let that = this;
        setTimeout(function() {
          console.log("普通函数", that.name);
        }, 1000);
      },
      outout2() {
        setTimeout(() => {
          console.log("箭头函数", this.name);
        }, 1000);
      },
    };
    obj.outout1(); // 普通函数 obj
    obj.outout2(); // 普通函数 obj
    

    因为箭头函数的this是在定义的时候就确定的,使用它可以少写一步 this 指向,推荐使用。

    定时器

    • setTimeout:规定 N 秒后执行

    • setInterval:规定 N 秒后循环执行

    参数

    • 函数/字符串、字符串会触发eval()

    • 时长毫秒(ms)

    • 传入函数的参数列表

    传入函数

    // setTimeout / setInterval 使用
    setTimeout(
      (...args) => {
        let sum = args.reduce((p, c) => p + c);
        console.log(args, sum); //[ 1, 2, 3 ] 6
      },
      1000,
      1,
      2,
      3
    );
    // 这段代码的意思是:在 1 秒后将这个函数推入执行栈,然后传递参数1,2,3到函数中
    

    一秒后开始计算 1,2,3 的和,然后输出。

    传入字符串

    setTimeout("alert(0)", 2000);
    

    可以接受一个字符串,默认通过 eval() 解析后执行,但是 eval 函数非常耗性能,非特殊不推荐。

    返回值

    返回定时器的 ID ,用于清除定时器。

    clearInterval(n);
    clearTimeout(n);
    

    setTimeout

    核心逻辑:N 秒推入执行栈,而不是 N 秒后执行,

    使用场景:延迟执行某个操作时

    问题:

    • 设置 0 秒也会在下一个宏任务中执行(异步)

    • 定时器在 for 中输出 1-10 的坑(forEach 不可跳出循环)

    异步

    // for & setTimout
    for (var i = 1; i <= 10; i++) {
      setTimeout(() => {
        console.log(i); // ??
      }, 1000);
    }
    

    因为异步的原因,setTimeout 被延迟到下一次事件循环中执行。

    forEach

    forEach 不能跳出循环

    let arr = [1, 2, 3];
    arr.forEach((e) => {
      console.log(e);
      1, 2, 3;
      e += 1;
      if (e === 2) {
        // break !X
        // return !X
      }
    });
    console.log(arr); // [1, 2, 3];

    forEach中使用breakreturn等都不会跳出循环。

    上列操作可以转换为for操作

    for (let i = 0; i < arr.length; i++) {
      if (arr[i] === 2) {
        break;
      }
      arr[i] += 1;
    }
    console.log(arr); // [ 2, 2, 3 ]

    setInterval

    使用场景

    • 视频学习的定时保存学时

    • 扫码登录的轮询

    问题

    定时器不准确的原因

    • N 秒后推入执行栈,而不是 N 秒后执行

    • 会因为前面有代码在执行而导致时间变短

    案例代码:

    假设有一个 HTTP 轮询,每一秒查询一次数据。

    let startTime = new Date().getTime();
    let count = 0;
    setInterval(() => {
      let i = 0;
      while (i++ < 10000000); // 假设这里是查询数据带来的网络延迟,用来增加每次函数执行的时间
      count++;
      console.log(
        "与原设定的间隔时差了:",
        new Date().getTime() - (startTime + count * 1000),
        "毫秒"
      );
    }, 1000);
    

    代码在执行多次后,定时器会变得不准确,产生误差。

    定时器不及时清楚(小程序中)

    • clear的话会一直保存在内存中,造成内存泄漏。

    • 使用场景:保存学时、人脸识别、考试倒计时等

    • 多个页面栈共享定时器

    解决方法

    定时器不准确

    解决方法:使用settimeout模拟setinterval

    // 自定义一个定时器
    let timer = null;
    function interval(func, wait) {
      let interv = function() {
        func.call(null);
        timer = setTimeout(interv, wait);
      };
      timer = setTimeout(interv, wait);
    }
    
    // 使用定时器
    interval(() => {
      let date = new Date();
      console.log("log..", `${date.getMinutes()}: ${date.getSeconds()}`);
    }, 1000);
    
    // 清楚定时器
    setTimeout(() => {
      clearTimeout(timer);
    }, 1000 * 6);
    

    定时器太多清楚不掉,造成内存泄漏

    解决方法:批量清楚定时器

    // 清楚当前页面的所有定时器
    for (let i = 1; i < 100000; i++) {
      clearInterval(i);
      clearTimeout(i);
    }
    

    建议及时保存定时器的id,用于清除。

    推荐阅读  点击标题可跳转

    Vue 项目性能优化技巧分享

    工作两年前端经验分享

    2021 阿里字节快手面经 & 个人成长经验分享

    关注下方「前端开发博客」,回复 “加群”

    加入我们一起学习,天天进步

    如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~

       “分享、点赞、在看” 支持一波  

    展开全文
  • 美团点评技术文档-后端+前端技术,美团点评2018年最新技术文档。
  • Github 优质库分享 -02 后端架构师技术图谱 《后端架构师技术图谱》 涵盖大量知识点,迷茫不知道该怎么学,看这个就够了,加油努力学习。 目录 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全...
  • 欢迎大家前往腾讯云+社区...今天讲的是怎么使用Serverless做后端技术分享。我的职业偏向是后端,可能不是写前端,不是使用Node.js,更多是使用CR做后端语言,今天关注的微信小程序,我这一块的分享更多是怎么实现它...
  • * * * * * 企业网站开发技术 第五节 Web后端技术 经济与管理学院 刘志鹏 Web前端技术学习路线图 /view/link/57d28d0ee4b0942d7a89c9dd 目录 1静态和动态网页 2Web后端技术 3Java工程师 4JavaWeb开发技术 操作系统 ...
  • https://github.com/pengsenjie/architect-awesome
  • 后端技术

    千次阅读 2020-09-14 15:09:27
    说到后端开发,难免会遇到各种所谓高大上的「关键词」,对于我们应届生小白,难免会觉得比较陌生,因为在学校确实比较少遇见这些所谓高大上的东西,那么今天就带着学习的态度和大家分享这些看似可以装逼可以飞的带...
  • 后端技术讨论

    千次阅读 2016-11-27 13:14:02
    这里有一篇关于后端技术需要学什么东西的讨论。有机会大家去看看吧 https://www.zhihu.com/question/26350691
  • 下面给大家分享下我的面试大全资料,如果你也有需要,可以戳这里即可免费领取我的这份复习资料 第一份是我的后端JAVA面试大全 后端JAVA面试大全 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理 MySQL+...
  • 2017 后端面试经历分享

    千次阅读 2017-03-23 18:56:49
    后端面试分享
  • 1. 2021 有哪些不容错过的后端技术趋势 整理 2020 年后端技术要点。 标签: #后端 #技术趋势 #总结 2. 让网页赏心悦目、让阅读回归初心 - Circle | 染河学长 广告太多分散注意力、配色太丑不忍直视、字体太小看不...
  • 本次分享面向广大的后端技术开发人员,以 Java 编程语言为切入点,按照不同的技术切面逐步分享,煌煌之言,不辞辛苦,希望能带给你点滴的收获. 本场 Chat 您将学到如下内容: Java 初识 设计原则及模式 Spring ...
  • 游戏技术精华分享之腾讯游戏学院-后端篇 腾讯游戏学院2017程序公开课 腾讯游戏学院,直接搜索,如服务器,即出现对应课程 项目篇 龙之谷服务器设计 《天天酷跑》手游后台属性系统设计 教学篇 游戏服务器架构...
  • 分享一些 Java 后端的个人干货

    万次阅读 多人点赞 2018-06-28 16:42:12
    这段时间里,听过许多前辈的经验与分享,也看过许多大佬的文章和作品。找了个时间整理和总结了一下我个人到目前为止一路以来的听到看到或者自己感悟到的干货。 这篇文章可能更多的是面对初学者,当然,只要有人看...
  • Python后端技术

    千次阅读 2019-10-22 19:53:26
    Python后端技术栈(一) Happiness is a way of travel. Not a destination. 幸福是一种旅行方式。 不是目的地。 1.导航 1.1Python 语言基础 1.语言特点 2.语法基础 3.高级特性 1.2算法与数据结构 1.常用算法和数据...
  • 团队技术博客 淘宝UED淘宝用户体验团队 淘宝核心系统淘宝核心系统团队博客 阿里巴巴数据库团队专注数据库管理开发运维 淘宝通用产品专注JAVA技术 ...淘宝QA致力于做测试的...百度技术分享交流百度的互联网技术 ...
  • 参考文章:Java开源项目之「自学编程之路」:学习指南+面试指南+资源分享+技术文章 参考书籍江南一点雨大佬写的《springboot+vue全栈开发实战》 参考Java团长的博客。 我打算分三个部分讲后端技术栈:历史、学习框架...
  • Java后端技术栈,到底如何深入学习?废话不多说,直接上干货:(如下图)一、阅读源码阅读源码二、1.分布式架构分布式架构2.分布式架构分布式架构3.分布式架构分布式架构三、微服务架构微服务架构四、并发编程并发...
  • FEBS项目搭建后端技术简介

    千次阅读 2020-02-06 15:15:29
    FEBS项目搭建后端技术简介所用技术Spring-BootSpring-Boot的特点MyBatis-Plus(数据持久化)Hikari:Mavenredisredis特点shiro 所用技术 最近在学习FEBS开源项目,记录了一下大致的后端所用的技术,及其大致作用 之后...
  • JAVA后端应该学什么技术

    万次阅读 多人点赞 2019-07-01 16:17:34
    Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程...Servlet技术是Java后端的重要技术之一,作为Java Web开发的核心组件,Servlet承担了Web MVC结构中的核心作用(功能导航)。传统的Model2结构...
  • 本文为博主2020年秋招提前批的c/c++后端开发面经整理,包括C/C++语言基础,计网,数据库,linux,操作系统,场景题,智力题和hr常问题。面试问题来自前人的工作和博主面试时遇到的值得记录的问题,其中面试题答案...
  • (基于XML的异步JavaScript) 通俗的说,就是通过ajax技术后端的数据拿出来然后在前端页面中显示出来。 也相当于异步的JS和XML,要明确ajax不是一种编程语言,它不需要任何浏览器插件,但需要用户允许JS在浏览器...
  • 最全Java后端技术

    2021-05-24 12:17:14
    最近很多伙伴留言,说我只发了2021Java后端的路线,没有发都需要学习哪些技术。为此,我特地总结了一份Java后端开发需要的技术技术 构建工具 Maven:http://maven.apache.org/ Gradle:https://gradle.org/ ...
  • 前段时间在跟学生聊天,有同学提到了:以后的工作方向,他说:听学长学姐说后端薪资要比前端高,并且掌握公司核心技术的都是后端,但是自己想要从事前端该怎么规划发展自己的事业? 大致是这个意思记得不是很仔细了...
  • 最近有些网友问我如何学习 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从何下手。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,726
精华内容 32,690
关键字:

分享技术后端