百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

JavaScript报错了?不要慌!怎么看怎么处理都在这里

lipiwang 2025-05-24 15:21 2 浏览 0 评论


在开发中,有时,我们花了几个小时写的 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/g;


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 = '你最棒了,点个赞呗!'


总结

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

关注我!私信要学习资料 ,源码 ,面试题!
关注我!私信要学习资料 ,源码 ,面试题
关注我!私信要学习资料 ,源码 ,面试题

相关推荐

httpclient+jsoup实现小说线上采集阅读

前言  用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读。(说明:仅用于技术学习、研究) ...

Python3+requests+unittest接口自动化测试实战

一、Requests介绍RequestsisanelegantandsimpleHTTPlibraryforPython,builtforhumanbeings.翻译过来就是...

授权码 + PKCE 模式|OIDC & OAuth2.0 认证协议最佳实践系列【03】

在上一篇文章中,我们介绍了OIDC授权码模式,本次我们将重点围绕授权码+PKCE模式(AuthorizationCodeWithPKCE)进行介绍,从而让你的系统快速具备接入用户认...

JWT 在 Java Web 开发中的奇妙应用

JWT在JavaWeb开发中的奇妙应用在当今的互联网世界里,安全始终是一个绕不开的话题。而当我们谈论到Web应用的安全性时,认证和授权绝对是其中的核心部分。说到这,我忍不住要给大家讲个笑话...

动手操作:一个 OAuth 2 应用程序(2) - 配置 Keycloak 为授权服务器

接上一篇《动手操作:一个OAuth2应用程序(1)-应用程序场景》进行场景分析后,本篇就开始动手实现授权服务器。在本文中,我们将Keycloak配置为系统的授权服务器(图3)。...

JSON Web Token是什么?

JSONWebToken(缩写JWT)是目前最流行的跨域认证解决方案。传统的session认证http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证...

Keycloak Servlet Filter Adapter使用

KeycloakClientAdapters简介Keycloakclientadaptersarelibrariesthatmakeitveryeasytosecurea...

使用JWT生成token

一、使用JWT进行身份验证1、传统用户身份验证Internet服务无法与用户身份验证分开。一般过程如下:用户向服务器发送用户名和密码。验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中...

在word中通过VBA调用百度翻译API在线翻译

一天的时间,借助各种AI终于解决了这个问题:在word中通过VBA调用百度翻译API进行在线翻译。给我的word又添加了一项神技。先上代码:Sub宏5()''宏5宏Dimapp...

API 安全之认证鉴权

作者:半天前言API作为企业的重要数字资源,在给企业带来巨大便利的同时也带来了新的安全问题,一旦被攻击可能导致数据泄漏重大安全问题,从而给企业的业务发展带来极大的安全风险。正是在这样的背景下,Ope...

用WordPress建站哪些插件会拖慢速度影响排名?

你是否发现网站加载总慢半拍,SEO排名死活上不去?八成是插件惹的祸!80%的站长不知道,WordPress插件用错类型或配置不当,分分钟让网站速度暴跌,爬虫抓取效率直接砍半。缓存插件没装对,越用越卡你...

JavaScript报错了?不要慌!怎么看怎么处理都在这里

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

跨站脚本攻击(四)
跨站脚本攻击(四)

04XSS漏洞挖掘技巧4.1常见的绕过姿势实际应用中web程序往往会通过一些过滤规则来阻止带有恶意代码的用户输入被显示,但由于HTML语言的松散性和各种标签的不同优先级,使得我们绕过过滤规则成为了可能。4.1.1利用大小写绕过HTML标签...

2025-05-24 15:21 lipiwang

WAF-Bypass之SQL注入绕过思路总结

过WAF(针对云WAF)寻找真实IP(源站)绕过如果流量都没有经过WAF,WAF当然无法拦截攻击请求。当前多数云WAF架构,例如百度云加速、阿里云盾等,通过更改DNS解析,把流量引入WAF集群,流量经...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题):1.登录时的验证码2.自动登录的实现3.怎么维护前后端登录状态在这和大...

取消回复欢迎 发表评论: