转自Alon's Blog

JavaScript 错误以及如何修复

发表于 2015-02-01   |   分类于 JavaScript  |

原文《JavaScript Errors and How to Fix Them
作者:Jani Hartikainen
翻译:涂鸦码农

JavaScript 调试是一场噩梦:首先给出的错误非常难以理解,其次给出的行号不总有帮助。有个查找错误含义,及修复措施的列表,是不是很有用?

以下是奇怪的 JavaScript 错误列表。同样的错误,不同的浏览器会给出不同的消息,因此有一些不同的例子。

如何读懂错误?

首先,让我们快速看下错误信息的结构。理解结构有助于理解错误,如果遇到列表之外的错误会减少麻烦。

Chrome 中典型的错误像这样:


1

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

当尝试调用一个像方法的值时,这个值并不是一个方法。比如:


1

2


var foo = undefined;

foo();

如果你尝试调用一个对象的方法时,你输错了名字,这个典型的错误很容易发生。


1

var x = document.getElementByID(‘foo‘);

由于对象的属性不存在,默认是 undefined ,以上代码将导致这个错误。

尝试调用一个像方法的数字,“number is not a function” 错误出现。

如何修复错误:确保方法名正确。这个错误的行号将指出正确的位置。

Uncaught ReferenceError: Invalid left-hand side in assignment

相关错误:Uncaught exception: ReferenceError: Cannot assign to ‘functionCall()’, Uncaught exception: ReferenceError: Cannot assign to ‘this’

尝试给不能赋值的东西赋值,引起这个错误。

这个错误最常见的例子出现在 if 语句使用:


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 总会引起错误。


1

2

3

4


var a = { };

var b = { a: a };

a.b = b;

JSON.stringify(a);

由于以上的 a 和 b 循环引用彼此,结果对象无法转换成 JSON。

如何修复错误:移除任何想转换成 JSON 的对象中的循环引用。

Unexpected token ;

相关错误:Expected ), missing ) after argument list

JavaScript 解释器预期的东西没有被包含。不匹配的圆括号或方括号通常引起这个错误。

错误信息可能有所不同 - “Unexpected token ]” 或者 “Expected {” 等。

如何修复错误:有时错误出现的行号并不准确,因此很难修复。

  • [ ] { } ( ) 这几个符号不配对常常导致出错。检查所有的圆括号和方括号是否配对。行号指出的不仅是问题字符。
  • Unexpected / 跟正则表达式有关。此时行号通常是正确的。
  • Unexpected ; 对象或者数组字面量里面有个 ; 通常引起这个错误,或者函数调用的参数列表里有个分号。此时的行号通常也是正确的。

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 ,把它当成了对象。例如:


1

2


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 ,把它当成了一个对象。例如:


1

2


var someVal = null;

someVal.foo = 1;

如何修复错误:也是由于拼写错误所致。检查错误指出的行号附近的变量名。

Uncaught RangeError: Maximum call stack size exceeded

相关错误:Related errors: Uncaught exception: RangeError: Maximum recursion depth exceeded, too much recursion, Stack overflow

通常由程序逻辑 bug 引起,导致函数的无限递归调用。

如何修复错误:检查递归函数中可能导致无限循环 的 bug 。

Uncaught URIError: URI malformed

相关错误:URIError: malformed URI sequence

无效的 decodeURIComponent 调用所致。

如何修复错误:按照错误指出的行号,检查 decodeURIComponent 调用,它是正确的。

XMLHttpRequest cannot load http://some/url/. 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/

错误肯定是使用 XMLHttpRequest 引起的。

如何修复:确保请求的 URL 是正确的,它遵循同源策略 。最好的方法是从代码中找到错误信息指出的 URL 。

InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

相关错误:InvalidStateError, DOMException code 11

代码调用的方法在当前状态无法调用。通常由 XMLHttpRequest 引起,在方法准备完毕之前调用它会引起错误。


1

2


var xhr = new XMLHttpRequest();

xhr.setRequestHeader(‘Some-Header‘, ‘val‘);

这时就会出错,因为 setRequestHeader 方法只能在 xhr.open 方法之后调用。

如何修复:查看错误指出的行号,确保代码运行的时机正确,或者在它(例如 xhr.open
)之前添加了不必要的调用

结论

我看过不少无用的 JavaScript 错误,比如 PHP 中声名狼藉的异常 Expected T_PAAMAYIM_NEKUDOTAYIM 。抛出更熟悉的错误才更有意义。现代浏览器不再抛出完全无用的错误,才会更有帮助。

转自Alon's Blog

时间: 2024-10-30 10:51:59

转自Alon's Blog的相关文章

分享最全的前端资源

专门搜集整理前端工作中遇到的各种问题.解决方案.新技术和热门工具插件等 一.团队组织 网站 说明 腾讯 AlloyTeam 团队 腾讯Web前端团队,代表作品WebQQ,致力于前端技术的研究 ISUX 腾讯社交用户体验设计,简称ISUX,腾讯设计团队网站 CDC 腾讯用户研究与体验设计部 FEX 百度Web前端研发部出品 淘宝前端团队(FED) 用技术为体验提供无限可能 凹凸实验室 京东用户体验设计部出品 奇舞团 奇虎360旗下前端开发团队出品 阿里巴巴国际UED团队 在更新的屏幕里创造出更好的

shdsadjkwqjkjkwqwqwq

http://blog.zhulong.com/blog/detail5686154.html http://blog.zhulong.com/blog/detail5686160.html http://blog.zhulong.com/blog/detail5686166.html http://blog.zhulong.com/blog/detail5686170.html http://blog.zhulong.com/blog/detail5693565.html http://blo

鞍山的好奇我合计为顷刻间即可完全健康请我

http://blog.zhulong.com/blog/detail5686154.html http://blog.zhulong.com/blog/detail5686160.html http://blog.zhulong.com/blog/detail5686166.html http://blog.zhulong.com/blog/detail5686170.html http://blog.zhulong.com/blog/detail5693565.html http://blo

ashdwhqjhjwqejhwqjkjkwqjkwqwq

blog.zhulong.com/blog/detail5686154.html blog.zhulong.com/blog/detail5686160.html blog.zhulong.com/blog/detail5686166.html blog.zhulong.com/blog/detail5686170.html blog.zhulong.com/blog/detail5693565.html blog.zhulong.com/blog/detail5693574.html blog

sadhqhjwjhwqjkwqjkjkqwwq

http://blog.zhulong.com/blog/detail5686154.html http://blog.zhulong.com/blog/detail5686160.html http://blog.zhulong.com/blog/detail5686166.html http://blog.zhulong.com/blog/detail5686170.html http://blog.zhulong.com/blog/detail5693565.html http://blo

鞍山地区无计划为全家健康去我家可千万

blog.zhulong.com/blog/detail5686154.html blog.zhulong.com/blog/detail5686160.html blog.zhulong.com/blog/detail5686166.html blog.zhulong.com/blog/detail5686170.html blog.zhulong.com/blog/detail5693565.html blog.zhulong.com/blog/detail5693574.html blog

软件测试 Top 120 Blog (博客)

软件测试 Top 120 Blog (博客) 2015-06-08 转自:    软件测试 Top 120 Blog (博客) # Site Author Memo 1 DevelopSense Michael Bolton Context-driven school 2 James Bach's Blog James Bach Context-driven school 3 Huib Schoots’ Blog Huib Schoots Context-driven,ET 4 Cem Kane

The importance of blog

写 blog 文章,是种与自我的对话,也是种与外界的联系,也是获得能力或 技术学习 的一种捷径.是在让自己变强变好,是在练习着让自己吸收更多.反应更快.表达更好. 很多人会说我不会写文章,不会表达,没啥东西可写,就算是写了一点东西也不会有人看. 你想让自己表达能力变好吗?如果答案是「Yes」,那你觉得没有练习,表达能力就会变好吗? 一个人从脑袋里面接收到资讯,思考,做出反应外显出来,达到效果,这个过程是需要大量练习才能缩短反应时间并精准地达到效果. 我想大家都同意,这是个资讯爆炸的时代,每一天都

大前端完整学习路线(详解)//转载自csdn:http://blog.csdn.net/u011047006/article/details/52597178

第一阶段: HTML+CSS: HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础: Js基础教程.js内置对象常用方法.常见DOM树操作大全.ECMAscript.DOM.BOM.定时器和焦点图. JS基本特效: 常见特效.例如:tab.导航.整页滚动.轮播图.JS制作幻灯片.弹出层.手风琴菜单.瀑布流布局.滚动事件.滚差视图. JS高级特征: 正则表达式.排序算法.递归算法.闭包.函数节流.作用域链.基于距离运动框架.面向对象基础. JQuer