再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿


Posted in Javascript onDecember 09, 2020

在开发中,有时,我们花了几个小时写的 JS 代码,在游览器调试一看,控制台一堆红,瞬间一万头草泥马奔腾而来。至此,本文主要记录 JS 常见的一些报错类型,以及常见的报错信息,分析其报错原因,并给予处理方法。并且将介绍几种捕获异常的方法。

常见的错误类型

RangeError:标记一个错误,当设置的数值超出相应的范围触发。比如,new Array(-20)。

ReferenceError:引用类型错误,当一个不存在的变量被引用时发生的错误。比如:console.log(a)。

SyntaxError:语法错误。比如 if(true) {。

TypeError:类型错误,表示值的类型非预期类型时发生的错误。

常见的错误

RangeError: Maximum call stack size exceeded

含义:超出了最大的堆栈大小

为什么报错?

在使用递归时消耗大量堆栈,导致游览器抛出错误,因为游览器给分配的内存不是无限的。

举个栗子

function pow(x, n) {
 return x * pow(x, n - 1);
}
pow(10,5);

处理办法

使用递归的时候,设定一个条件来终止递归,否则会无限循环,直到用尽调用堆栈空间为止。

function pow(x, n) {
  if (n == 1) return x;
  return x * pow(x, n - 1);
 }
pow(10,5);

ReferenceError: "x" is not defined

含义:“x”未定义

为什么报错?

当你引用一个没有定义的变量时,抛出一个ReferenceError; 当你使用变量的时候,这个变量必须要声明,或者你可以确保它在你当前的脚本或作用域 (scope) 中可用。

举个栗子

// 变量未声明
console.log(a);
fn();
// 错误的作用域  
function sum() {
 let number1 = 20,number2 = 30;
 return number1 + number2;
}
console.log(number1);

处理办法

1. 变量使用var|let|const声明

2. 提升变量的作用域

// 变量未声明
let a;
function fn() {};
console.log(a);
fn();

// 错误的作用域
let number1 = 20, number2 = 30;
function sum() {
  return number1 + number2;
}
console.log(number1);

SyntaxError: Identifier 'x' has already been declared

含义: 标识符已声明

为什么报错?

某个变量名称已经作为参数出现了,又在使用let再次声明。

举个栗子

// let 重复声明
let a = 0;
let a = 2;

// 在函数中参数已经出现,函数里使用let重新声明
function fn(arg) {
 let arg = [];
}

SyntaxError: Invalid or unexpected token

含义:捕获无效或意外的标记

为什么报错?

代码中有非法的字符或者缺少必要的标识符号,比如减号 ( - ) 与连接符 ( ? ) ,或者是英文双引号 ( " ) 与中文双引号 ( “ )。

举个栗子

// 遗漏的字符
let str = 'string;
let colors = ['#000', #333', '#666'];

// 使用特殊字符
let str1 = 'string";
let str2 = 5#5;

// 错配字符(使用中文引号字符)
let str3 = ‘string';

处理办法

检查是否有特殊字符或者是否遗漏一些字符。

SyntaxError: Unexpected end of input

含义:意外的终止输入

为什么报错?

代码中某些地方的括号或引号不匹配缺失,缺少()、[]、{}等。

举个栗子

// 缺少括号
if(true)
let obj = {id: 1
let arr = [1,2,3


// 缺少结束符号
(function () {
  console.log('hello world');
}()

处理办法

检查是否有特殊字符或者是否遗漏一些字符,括号需要配对出现。

TypeError: Cannot read property 'x' of undefined
TypeError: Cannot set property 'x' of undefined

含义:无法读取属性‘x', 无法设置属性 'x'

为什么报错?

访问或设置未定义(undefined)或null值的属性时会发生这种报错。

举个栗子

// undefined
let a = undefined;
a.id; // 读取
a.id = 1; // 设置
// null
let b = null;
b.id; // 读取
b.id = 2; // 设置
null.filter(item=>item)

处理办法

有一些方法可以避免这种错误。一种简单且适用于小型属性链的方法是使用逻辑运算符&&。

let obj = undefined;
console.log(obj&&obj.id);

TypeError: 'x' is not a constructor

含义:表示 ‘x'不是构造函数

为什么报错?

使用不是构造器的对象或者变量来作为构造器使用。比如:new 10;

举个栗子

var Car = 1;
new Car();
new Math();

处理办法

使用正确的构造函数。Generator functions 也不能作为构造器来使用。

function Car(make, model, year) {
 this.make = make;
 this.model = model;
 this.year = year;
}

SyntaxError: Invalid regular expression flags

含义:正则表达式标志无效

为什么报错?

在代码中出现了无效的正则表达式的标记。

举个栗子

let reg = /foo/bar;

处理办法

let reg = /foo/bar;

DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

含义:无效的Url

为什么报错?

在使用ajax 请求时url错误,导致请求失败

举个栗子

function createXHR(url) {
  var xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.send('user=admin');
  xhr.onreadystatechange = function () {
  }
}
createXHR('http://192.168.10.8080'); // 错误url
createXHR('http:/192.168.10:8080/open'); // 缺少 /,注:有些游览器会自动补全

处理办法

检查url 请求是否正确,保证请求路径的完整。

createXHR('http://192.168.10:8080');

异常调试及捕获

try/catch

JS中处理异常的一种模式,try用于可能会发生错误的代码,catch对错误的处理

try{
 // 可能会导致错误的代码
}catch(error) {
 // 错误处理
}

举个栗子

try{
 console.log(a)
}catch(error) {
  // 打印错误信息
 console.log(error); // ReferenceError: a is not defined
}

throw

用来抛出一个用户自定义的异常,执行将被停止。

function getUserName(name) {
  if(!name) throw new Error('用户名无效');
  return name;
}
getUserName();

Promise 的异常处理

Promise执行中,本身自带try...catch的异常处理,出错时,将错误Rejact函数。

new Promise((resolve, reject) => {
 throw new Error('error!');
}).catch(alert);

console.log() 方法

在游览器中,使用console.log打印javaScript的值。

let value = '你最棒了,点个赞呗!'
console.log(value);

debugger 断点调试

用于停止执行 JavaScript,并调用调试函数。

let value = 15;
debugger
document.querySelector('body').innerHTML = '你最棒了,点个赞呗!'

总结

报错就是那么简单,根据这些代码敲一敲,熟悉一些常用的报错信息,便于在报错的时候快速地定位到报错原因。希望对可爱的你有用。

到此这篇关于再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿的文章就介绍到这了,更多相关javascript报错处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
js 动态文字滚动的例子
Jan 17 Javascript
js中 关于undefined和null的区别介绍
Apr 16 Javascript
通过JS来判断页面控件是否获取焦点
Jan 03 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
Aug 26 Javascript
省市二级联动小案例讲解
Jul 24 Javascript
JS获取url参数、主域名的方法实例分析
Aug 03 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
Dec 31 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 #Javascript
ES6中的类(Class)示例详解
Dec 09 #Javascript
JavaScript实现表单验证功能
Dec 09 #Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 #Javascript
javascript全局自定义鼠标右键菜单
Dec 08 #Javascript
javascript局部自定义鼠标右键菜单
Dec 08 #Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 #Javascript
You might like
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
JavaScript中的Promise使用详解
2015/06/24 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
pandas Dataframe行列读取的实例
2018/06/08 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
Django实现表单验证
2018/09/08 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
秋天的怀念教学反思
2014/04/28 职场文书
安全生产月活动总结
2014/05/04 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
导游词之潮音寺
2019/09/26 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
python创建字典及相关管理操作
2022/04/13 Python