# 如何修复那些奇怪的 JavaScript 错误
25
2015年01月
调试 JavaScript 也许是一场噩梦:一些错误非常难理解,并且给出的错误行号并不是总是很有帮助。如果有一个列表,列举这些错误的意思和如何修复它们,将对我们非常有帮助。
本文列举了 JavaScript 中一些奇怪的错误。对于相同的错误不同的浏览器可能给出不同的提示,所以分别给出了不同的例子。
## 如何阅读错误
进入正题之前,我们先快速分析一下错误消息的结构,这对我们理解错误消息非常有用,同时也将有助于你理解那些没有在本文中列举的错误。
Chrome 中一个典型的错误看起来像这样:
> Uncaught TypeError: undefined is not a function
该错误的结构如下:
1. **Uncaught TypeError:**
该部分并不是很有用。
`Uncaught`
表示该错误没有被
`catch`
语句捕获,
`TypeError`
是错误名。
2. **undefined is not a function:**
是消息体,需要从字面上理解。例如本例中,它的字面意思是,代码尝试将
`undefined`
当作函数使用。
其他基于 webkit 的浏览器,比如 Safari,错误消息与 Chrome 基本一样。Firefox 的错误消息与上面非常相似,但并不总是都包含第一部分,最近版本的 IE 的错误消息也比 Chrome 的简单,但在这里,更简单并不意味着更好。
下面看看我们经常会遇到的一些错误。
## Uncaught TypeError: undefined is not a function
同类错误:
* number is not a function
* object is not a function
* string is not a function
* Unhandled Error: ‘foo’ is not a function
* Function Expected
尝试将一个值(value)当作函数使用,但该值并不是一个函数。例如:
| 12 | var foo = undefined;foo\(\); |
| :--- | :--- |
这个错误很常见,当调用对象中的一个方法,但写错了方法名:
| 1 | var x = document.getElementByID\('foo'\); |
| :--- | :--- |
访问对象中不存在的属性时将返回`undefined`,上面代码就将出现该错误。
其他类似的错误,比如“number is not a function”发生在尝试将一个`Number`当作函数使用时。
**如何修复:**确保函数名正确。对于该错误,行号通常准确地指向了错误发生的位置。
## Uncaught ReferenceError: Invalid left-hand side in assignment
同类错误:
* Uncaught exception: ReferenceError: Cannot assign to ‘functionCall\(\)’
* Uncaught exception: ReferenceError: Cannot assign to ‘this’
当尝试给一个不能被赋值的变量赋值时将发生该错误。看下面的典型例子:
| 1 | if\(doSomething\(\) = 'somevalue'\) |
| :--- | :--- |
在上面例子中,开发人员不小心将`==`写成了`=`,错误消息“left-hand side in assignment”指等号左边包含不能被赋值的变量。
**如何修复:**确保不给函数函数的返回值或`this`关键字赋值。
## Uncaught TypeError: Converting circular structure to JSON
同类错误:
* Uncaught exception: TypeError: JSON.stringify: Not an acyclic Object
* TypeError: cyclic object value
* Circular reference in value argument not supported
该错误总是发生在使用`JSON.stringify`序列化一个存在循环引用的对象时。
| 1234 | var a = { };var b = { a: a };a.b = b;JSON.stringify\(a\); |
| :--- | :--- |
由于上面`a`和`b`两个对象都彼此相互引用,结果导致对象不能被转换为 JSON 字符串。
**如何修复:**移除将要被转换为 JSON 字符串对象内部的循环引用。
## Unexpected token ;
同类错误:
* Expected \)
* missing \) after argument list
通常发生在缺少括号或分号时。
该错误中所谓的符号(token)可以多种多样,如“Unexpected token \]”或“Expected {”等等。
**如何修复:**该错误提示的行号有时并不能指向正确的位置,这增加了修复难度。
* 错误信息中包含“\[ \] { } \( \)”时,通常是因为缺少配对的部分,检查所有括号,保证都是配对的。这种情况下,行号通常指向了其他位置,问不是错误的位置。
* 异常的
`/`
和正则表达式有关,行号指向了正确的位置。
* 异常的
`;`
通常发生在对象、数组或函数调用时参数列表内部包含
`;`
,行号也指向了正确的位置。
## Uncaught SyntaxError: Unexpected token ILLEGAL
同类错误:
* Unterminated String Literal
* Invalid Line Terminator
字符串字面量缺少闭合的引号。
**如何修复:**确保所有字符串都包含闭合的引号。
## Uncaught TypeError: Cannot read property ‘foo’ of null, Uncaught TypeError: Cannot read property ‘foo’ of undefined
同类错误:
* TypeError: someVal is null
* Unable to get property ‘foo’ of undefined or null reference
尝试将`null`过`undefined`作为一个对象使用,例如:
| 12 | var someVal = null;console.log\(someVal.foo\); |
| :--- | :--- |
**如何修复:**通常是由于书写失误导致,确保错误提示的行号附近的变量都是书写正确的。
## Uncaught TypeError: Cannot set property ‘foo’ of null, Uncaught TypeError: Cannot set property ‘foo’ of undefined
同类错误:
* TypeError: someVal is undefined
* Unable to set property ‘foo’ of undefined or null reference
尝试为值为`null`或`undefined`的对象的属性赋值。
| 12 | var someVal = null;someVal.foo = 1; |
| :--- | :--- |
**如何修复:**这也通常是由于书写错误导致,检查错误提示的行号附近的变量名是否正确。
## Uncaught RangeError: Maximum call stack size exceeded
同类错误:
* Uncaught exception: RangeError: Maximum recursion depth exceeded
* too much recursion
* Stack overflow
通常是由程序逻辑问题,导致了无限递归的函数调用。
**如何修复:**检查函数的递归调用,确保函数不是无限递归的。
## Uncaught URIError: URI malformed
同类错误:URIError: malformed URI sequence
无效的`decodeURIComponent`调用将导致该错误。
**如何修复:**确保行号所指位置的`decodeURIComponent`调用的参数正确。
## XMLHttpRequest cannot load . No ‘Access-Control-Allow-Origin’ header is present on the requested resource
同类错误:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at[http://some/url/](http://some/url/)
该错误总是由使用`XMLHttpRequest`时导致。
**如何修复:**确保请求的 url 满足[同源策略](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)。
## InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
同类错误:
* InvalidStateError
* DOMException code 11
该错误表示调用对象的方法时,对象的状态不对。在使用`XMLHttpRequest`时,在其准备好之前尝试调用其中的方法将导致该错误。
| 12 | var xhr = new XMLHttpRequest\(\);xhr.setRequestHeader\('Some-Header', 'val'\); |
| :--- | :--- |
上例中将导致错误,因为`setRequestHeader`方法只能在`xhr.open`之后调用。
**如何修复:**检查行号指示的位置,确保代码运行在合适的时间,或在这之前添加必要的函数调用(比如`xhr.open`)。
- 首页
- pm2
- pm2
- pm2 离线安装
- pm2 使用指南
- node
- 正则
- web
- webpack
- 配置
- 优化代码体积
- plugin-proposal-decorators
- webpack 打包原理解析
- babel presets配置 babel7
- 配置路径别名
- 去除开发中的警告信息
- css
- 滚动条
- input自动填充背景色
- 颜色渐变
- scss
- 网页定制光标
- 超出文本显示省略号。。。
- calc兼容性写法
- box-sizing
- clip-path
- 苹果手机页面滑动卡顿
- 字体间距根据父级宽度自适应
- 纯css动态效果
- 清除浮动的三种方法
- 按钮增加闪烁效果
- 字体渐变
- react
- mobx
- 路由
- antd 表格在safari上卡顿
- 项目初始化
- react-antd-mobx-momnet
- 显示字符串中的标签
- antd Select 在搜索精准度
- 路由切换动态过渡效果
- css中图片打包后的路径出错
- antd upload 无法及时更新state
- antd DatePicker设置中文失败
- antd-pro 添加登录页面报错
- new Array创建新数组数据指向相同
- react 页面刷新渲染两次
- useEffect
- Hooks 闭包解决方案
- hooks 方法封装
- Plugin "react" was conflicted between "package.json » eslint-config-react-app
- javascript
- canvas
- 多张图片合成一张
- 排序
- js比较符号==、===
- 运动函数封装(简易、通用)
- 导出表格(excel )
- react使用demo
- xlsx导出excel
- js获取屏幕高度宽度
- toFixed 函数修改
- 获取cookie,url参数
- 奇怪的错误问题
- copy(深拷贝 浅拷贝)
- 导出pdf
- 解决图片失真
- 判断字符串长度(带中文)
- js中 文件、图片二进制和base64的互转
- 读取深度嵌套的json数据
- 手动实现Promise.all
- cookie 删除
- webpack 打包过后的文件报错 regeneratorRuntime is not defined
- 防抖与节流
- react hooks 中使用防抖节流
- 图片懒加载
- 重排和重绘
- 修复部分无法JASON.parse的数据
- react-native
- android-studio 打开调试工具
- 适配全面屏
- node
- 服务端 node + nginx 反向代理
- 生成文件夹目录列表
- mogodb常用操作
- 发布npm包
- cli工具
- 上传文件
- nodejs使用crypto进行加密/解密操作
- mongodb 加入验证之后连接失败
- nextjs使用问题
- node转发http请求
- mongodb 导入导出 备份
- node-sass 安装问题、安装失败等
- npm yarn 安装依赖太慢
- puppeteer 安装问题 centos
- mongoose
- 其他
- 禁止浏览器缓存
- chrome平滑滚动
- pdf预览
- 问题整理
- 资料
- 小程序
- fetch
- cookie 设置跨域资源共享
- taro 小程序
- taro request
- 设置npm镜像
- esbuild the service is no longer running
- 离线地图
- uniapp 转 vue-cli
- 工具
- Excel表格密码保护的解除方法
- vscode(插件)
- vscode 常用代码片段
- vscode 开启tab补全代码
- mac 百度网盘破解
- mysql 重置密码
- chrome 好用的扩展
- Mac/Linux/Windows通过命令调用浏览器打开某网页
- 小链接
- 数据库
- mongo
- sql文件导入
- join 用法
- sql 时间格式化 DATE_FORMAT
- 创建全文检索并分词查询
- 阿里云node-mysql 操作文档
- sql 时间查询
- mysql group查询结果合并为一行
- mysql 锁
- mysql count 同个字段多个结果合并到一行
- 解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题
- mysql 根据经纬度计算距离
- PHP
- 文件读取
- 接收前端json数据
- 自定义排序
- session 写入失败无法保存
- php 上传大文件$_FILES为空
- base64转图片
- composer.phar 安装东西太慢 切换国内镜像
- laravel sql查询记录
- 解决: Please provide a valid cache path.
- thinkphp开启多应用
- 上传文件报错 Filename cannot be empty
- php curl 报错 curl: (35) SSL connect error
- App
- android未授权错误(Flutter)
- uniapp
- 服务端
- mongodb 定时备份
- mysql 错误
- nginx 转发网络请求
- midwayjs 使用egg-mysql
- https 无法访问
- egg 配置跨域
- 算法实现
- 排序
- 全排列
- 无重复字符的最长子串
- 反转单向链表
- 斐波那契数列
- 有效的括号
- GIT
- git克隆大文件
- 面试整理
- 前端整理
- 大厂高级前端面试题
- 三年大厂面试题
- 面试经验
- 头条it技术工程师
- 每日学习
- 常见的数据结构
- 面试地址汇总
- 练习汇总
- 前端八股文
- mac环境配置
- mac nginx重启报错
- mac 安装redis
- fis配置
- 切换php版本
- Mac OS X下的Oh-My-ZSH安装与配置
- mac 查看端口进程 停止进程
- mac 配置ssh 免密码登录服务器
- navigate 中文破解
- 删除启动台无效文件夹
- 删除顶部图标(卸载后的软件还存在)
- 修复mac 下安装全局依赖失效
- navicate 完美破解 内有下载地址
- nginx 报错 500 "/usr/local/var/run/nginx/client_body_temp/0000000004" failed (13: Permission denied)
- 安装PHP redis扩展
- 安装zsh后 nvm node命令失效
- python
- python 在vscode中编辑,格式化文件总是提示There is no Pip installer available in the selected environment.
- 杂项
- 膝盖修复
- 微信打开网页链接反应巨慢
- chrome 显示http/https完整连接
- doracms
- pdfjs 中文无法显示
- docker
- go
- 指针、指针地址* &
- 脚本
- 京东疯狂的joy脚本
- 2021京东炸年兽
- LINUX