Jade Dungeon

Javascript tips

tips

线上错误报告

Javascript是一个动态语言,许多检查都是在运行时执行的,所以大多数错误只有执行到 的时候才能检查到,只能在发布前通过大量测试来发现。即使这样仍可能有少数没有 执行到的路径有错误,这只能通过线上错误报告来发现了。

window.onerror = function (errorMsg, fileLoc, linenumber) {
    var s = 'url: ' + document.URL + '\nfile:  ' + fileLoc
        + '\nline number: ' + linenumber
        + '\nmessage: ' + errorMsg;
    Log.error(s);       // 发给服务器统计监控
    console.log(s);
};

通常线上的Javascript都是经过了合并和压缩的,上报的文件名和行号基本上没法对应到 源代码,对查错帮助不是很大。不过最新版的Chrome支持在onerror的回调函数中获取 出错时的栈轨迹:window.event.error.stack.

严格模式

在代码的第一行,也就是首行加上"use strict"指令。

错误提示更加准确

变量必须声明:在非严格模式如果你没有声明一个变量就使用它,那么它会被当做一个 全局变量,在严格模式下则报错并抛出异常.我一直认为先声明后使用是一个好习惯,并且一直坚持.

属性或者参数不再可重复,如:var a = { aaa: 'dddddd', bbb: 'dddddd', aaa: 'cccccc' }

with被禁用。相当于API层次的禁用,不过貌似日常编码中我们使用with的时候并不多,所以 影响不大

Function中this不再是window。这一点算是严格模式下的一个很严谨的地方,经常在调用的 函数中我们用this指向window这类全局变量.但是在严格模式下,这样的this的值是undefined.

变量删除。相比较与属性删除我们可能很少或者几乎不会去进行变量删除的操作, 在严格模式下变量的删除是不允许的.而对于属性的删除,只有configurable设为true的属性才能被删除.

"use strict";

var x;

delete x; // 语法错误

var o = Object.create(null, 'x', {
	value: 1,
	configurable: true
});
delete o.x; // 删除成功

函数声明只能在顶层。这个改变非常可能对旧有的代码或者原本书写就不规范的代码造成 影响,以前我们定义function可以说是随心所欲,不管在if还是for中,都是想怎么样就怎么样.

在use strict模式下,为了与以后ECMAScript6接轨,规定了函数的声明只能在全局作用域 或者函数作用域的顶层进行声明.

arguments对象不再神奇。在严格模式中,函数里的arguments对象拥有传入函数值的 静态副本.而在非严格模式下,arguments对象的数组元素和函数参数都指向同一个值的引用 .这种限制会使得很多神奇的代码不再可用.

一旦你在文件首行加入了"use strict"那么整个文件都会受到这个限制,如果你合并所有 文件,这一点要格外注意.

当然你也可以灵活的使用"use strict",比如在函数内部的首行,或者在匿名函数作用域的 首行去使用.注意这里之所以强调是首行,因为浏览器对于脚本代码以及函数体中第一条 常规语句后的内容都不会当作指令去解析,也就是说如果你的"use strict"写在了 var a=0;以后,那么浏览器只会将其当作一个普通的表达式语句.

最后,希望大家在开发时条件允许的情况下尽量使用"use strict"开发,它最大的好处就是 帮助你更快的定位错误!详细的提示信息让你更好的纠错.