Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JS 面试总结 理论篇

JS 面试总结 理论篇

作者头像
mafeifan
发布于 2019-04-09 08:27:54
发布于 2019-04-09 08:27:54
1.5K00
代码可运行
举报
文章被收录于专栏:finleyMafinleyMa
运行总次数:0
代码可运行
JS为什么是单线程?

由于浏览器可以渲染DOM,JS也可以修改DOM结构,未避免冲突,JS执行的时候,浏览器DOM渲染会停止。 两段JS不能同时执行。

虽然 HTML5 中新引入的webworker支持多线程,但是不能访问DOM

浏览器允许的并发资源数限制,如何突破?

不同浏览器的并发请求数目限制不同

image.png

因为浏览器的并发请求数目限制是针对同一域名的。

  • 所以可以多设置子个域名来突破限制,比如简书的图片子域名upload-images.jianshu.io
  • 把资源文件放到CDN上,如https://cdn2.jianshu.io/assets/web-f5f4ced5c8b8a95fc8b4.js
单线程的解决方案,异步

和PHP不一样,写的代码顺序和执行的顺序是不一致的,PHP是同步。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(100)
// 等其他JS代码执行完才开始执行
setTimeout(()=> {
 console.log(200)
}, 10000)

console.log(300)

类似的ajax也是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(100)
// 等其他JS代码执行完才开始执行
$.ajax({
   url: 'xxx',
   success: res => {
      console.log(res)
   }
})
console.log(300)

这样有个弊端,可读性差

event loop 事件轮询

  • 同步代码,直接执行
  • 异步函数先放到异步队列中,待同步函数执行完毕,轮询执行异步队列的函数
  • 触发异步函数有 setTimeout,setImmediate,setInterval

实例1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setTimeout(() => console.log(1), 100)
setTimeout(() => console.log(2))
console.log(3)

显示顺序是: 3 2 1

image.png

实例2

image.png

显示顺序: d c a b 或 d c a b 这是由于ajax的success回调函数被放入异步队列的时间是不确定的,当然如果是本地测试,有可能的顺序是 d a...

image.png

关于$ajax的底层

jquery的 $ajax 实际上只对 XMLHttpRequest 对象的封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlhttp.open( "GET", "some/ur/1", true );
xmlhttp.onreadystatechange = function( data ) {
    if ( xmlhttp.readyState === 4 ) {
        console.log( data );
    }
};
xmlhttp.send( null );

底层的XmlHttpRequest对象发起请求,设置回调函数用来处理XHR的readystatechnage事件。 然后执行XHR的send方法。在XHR运行中,当其属性readyState改变时readystatechange事件就会被触发, 只有在XHR从远端服务器接收响应结束时回调函数才会触发执行

jQuery的$ajax的async 参数设置同步或异步的本质是?

关于$ajax 中的 async 参数 async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success。 其本质是 xhrReq.open(method, url, async)

JS 异常有做上报处理吗?是什么实现的
  • 捕获异常的方法通过使用 try...catch
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    var a = 1;
    var b = a + c;
} catch (e) {
    // 捕获处理
    console.log(e); // ReferenceError: c is not defined
}

缺点:增加代码量和维护性,不适用于整个项目的异常捕获。

  • window.onerror 相比try catch来说window.onerror提供了全局监听异常的功能:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) {
    console.log('errorMessage: ' + errorMessage); // 异常信息
    console.log('scriptURI: ' + scriptURI); // 异常文件路径
    console.log('lineNo: ' + lineNo); // 异常行号
    console.log('columnNo: ' + columnNo); // 异常列号
    console.log('error: ' + error); // 异常堆栈信息
};

console.log(a);

image.png

提交异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) {
    // 构建错误对象
    var errorObj = {
        errorMessage: errorMessage || null,
        scriptURI: scriptURI || null,
        lineNo: lineNo || null,
        columnNo: columnNo || null,
        stack: error && error.stack ? error.stack : null
    };

    if (XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
        xhr.open('post', '/middleware/errorMsg', true); // 上报给node中间层处理
        xhr.setRequestHeader('Content-Type', 'application/json'); // 设置请求头
        xhr.send(JSON.stringify(errorObj)); // 发送参数
    }
}
  • Vue 的捕获异常 在MVVM框架中如果你一如既往的想使用window.onerror来捕获异常,那么很可能会竹篮打水一场空,或许根本捕获不到,因为你的异常信息被框架自身的异常机制捕获了。使用Vue.config.errorHandler这样的Vue全局配置,可以在Vue指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和Vue 实例。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue.config.errorHandler = function (err, vm, info) {
  // handle error
  // `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子
  // 只在 2.2.0+ 可用
}
  • React 的 异常处理 -- Error Boundary 同样的在react也提供了异常处理的方式,在 React 16.x 版本中引入了 Error Boundary
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props);
        this.state = { hasError: false };
    }

    componentDidCatch(error, info) {
        this.setState({ hasError: true });

        // 将异常信息上报给服务器
        logErrorToMyService(error, info); 
    }

    render() {
        if (this.state.hasError) {
            return '出错了';
        }

        return this.props.children;
    }
}

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ErrorBoundary>
    <MyWidget />
</ErrorBoundary>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端错误捕获方案总结
本文主要摘抄自:https://juejin.cn/post/7172072612430872584#heading-10,主要用来记录和学习,也推荐大家看看原博主的文章。
蓓蕾心晴
2022/12/30
1.7K0
前端错误捕获方案总结
一篇文章教你如何捕获前端错误
随着前端页面承载功能越来越多,用户本地浏览器环境也错综复杂,因此即使有完善的测试,我们也无法保证上线的代码不会出错。在这种场景下,前端页面的监控就成了各个web项目必备的工具。
杨振涛
2019/07/31
4.2K0
JavaScript异常如何处理
在前端的开发工作当中,我们对于异常的处理可能关注的不是太多,因为js有基本的异常处理能力,很多错误会直接抛出来,打开控制台就能看到。但是如果因为异常导致网站卡死,甚至崩溃无法继续进行下去,对于用户的体验是相当差的,我们应该及时的捕获这些异常,对用户进行一些简要的温馨提示,并将异常进行及时的上报,以便于快速解决。
OECOM
2020/07/02
1.7K0
JavaScript异常如何处理
一篇文章教你如何捕获前端错误
JavaScript代码在用户浏览器中执行时,由于一些边界情况、本地环境的不可控等因素,可能会存在js运行时错误。
2020labs小助手
2019/07/10
3.6K0
如何搭建前端异常监控系统
是指用户在使用应用时,无法得到预期的结果。不同的异常带来的后果程度不同,轻则引起用户使用不悦,重则导致产品无法使用,从而使用户丧失对产品的认可。
发声的沉默者
2021/06/14
1.4K0
如何搭建前端异常监控系统
如何优雅处理前端异常?
对于 JS 而言,我们面对的仅仅只是异常,异常的出现不会直接导致 JS 引擎崩溃,最多只会使当前执行的任务终止。
grain先森
2019/03/29
2.2K0
如何优雅处理前端异常?
如何搭建前端异常监控系统
是指用户在使用应用时,无法得到预期的结果。不同的异常带来的后果程度不同,轻则引起用户使用不悦,重则导致产品无法使用,从而使用户丧失对产品的认可。
iOSSir
2020/07/24
1.9K0
如何搭建前端异常监控系统
从0到1搭建前端监控平台,面试必备的亮点项目
常常会苦恼,平常做的项目很普通,没啥亮点;面试中也经常会被问到:做过哪些亮点项目吗?
前端老道
2023/02/27
3.7K0
从0到1搭建前端监控平台,面试必备的亮点项目
剖析前端异常及其降级处理和防范方案
“异常”一词出自《后汉书.卷一.皇后纪上.光烈阴皇后纪》,表示非正常的,不同于平常的。在我们现实生活中同样处处存在着异常,比如小县城里的路灯年久失修...,上下班高峰期深圳的地铁总是那么的拥挤...,人也总是时不时会生病等等; 由此可见,这个世界错误无处不在,这是一个基本的事实。
winty
2021/07/27
1.5K0
前端异常的捕获与处理
? 这是第 89 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:前端异常的捕获与处理 https://www.zoo.team/arti
政采云前端团队
2021/03/16
3.9K0
前端异常的捕获与处理
沉淀了3年的自研前端错误监控系统,打通你的脉络
这篇文章是我的好朋友广胤所写,里面记录了我们2018年探索的前端监控体系的历程,由于在建设完后的我离职了,后续也没有继续能和广胤一起更进一步的探索,还是有一些些遗憾。还记得我第一次进入「兑吧」的时候,我就在简历里描述了错误监控之类的项目,其实当时我并没有在一个公司进行过实践,这大概是之前在网易的时候,闲来没事,进行的自我探索。然后进入「兑吧」后,没想到当时公司正好缺少这一块的基建,于是 TL 就让我和广胤负责了这块项目,也是这次经历让我从实习阶段就正式踏入了前端基础建设的道路,还是非常感谢这一次的机会,让我从单一的业务开发人员,转化到了结构型开发人员。记得在开发的项目的那一个月中,除了吃饭,或者和广胤讨论项目的进度问题,近乎一种忘我的开发状态。
秋风的笔记
2021/07/30
1.1K0
如何及时发现网页的隐形错误
先来说说JavaScript的错误类型,ECMA-262 定义了 7 种错误类型,说明如下:
zayyo
2023/11/02
3580
web前端监控的三个方面探讨
以 init 为程序的入口,代码中所有同步执行出现的错误都会被捕获,这种方式也可以很好的避免程序刚跑起来就挂。
smy
2018/08/01
1.2K0
web前端监控的三个方面探讨
React,优雅的捕获异常
https://juejin.cn/post/6974383324148006926
winty
2021/07/27
8930
前端异常捕获和定位
开发阶段,通过详细的报错信息,我们可以快速定位并解决问题。在生产,通过异常监控,根据异常埋点信息,我们可以第一时间知道异常信息,不至于造成严重后果。
GopalFeng
2020/09/24
1.4K0
前端异常捕获和定位
JavaScript 应用程序中的有效错误处理
了解 JavaScript 中的错误处理是非常重要的,它有助于提升用户体验并简化开发人员的调试过程。在这篇文章中,我们将探讨 JavaScript 应用程序中的错误处理的各个方面,包括常见错误、处理策略以及确保顺利运行的最佳实践。
泽霖
2023/12/21
5300
和安卓和ios的webview的数据交互
第一步是必写的 function setupWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } if (window.WVJBCallbacks) {
河湾欢儿
2019/07/24
1.3K0
前端 JS 异常那些事
从根本上来说,异常就是一个普通的对象,其保存了异常发生的相关信息,比如错误码、错误信息等。以 JS 中的标准内置对象 Error 为例,其标准属性有 message。许多宿主环境额外增加了 filename 和 stack 等属性
ACK
2024/05/04
4300
前端 JS 异常那些事
vue前端异常监控sentry实践
但是onerror事件无法捕获到网络异常的错误(资源加载失败、图片显示异常等),例如img标签下图片url 404 网络请求异常的时候,onerror无法捕获到异常,此时需要监听unhandledrejection。
CS逍遥剑仙
2019/03/18
5.5K2
项目实战-埋点系统初探
最近杂七杂八的事情比较多,难得抽出时间来弥补一下之前的系列,欠大家的埋点系列现在开始走起来
Cookieboty
2020/10/23
2.3K0
项目实战-埋点系统初探
相关推荐
前端错误捕获方案总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验