02-严格模式
9.1 严格模式
JavaScript严格模式在ECMAScript 5就出现了,它直接影响到ES6功能的使用。所以研究ES6的功能之前,我们先来看看严格模式。
当下面这行代码被加入到Node程序的代码顶部时,严格模式就会打开:
"use strict";
用单引号或者双引号都可以。
要对程序的所有依赖模块都强制使用严格模式,还有别的方法,比如使用 --strict_ mode
参数,但我不建议这么做。强制一个模块使用严格模式,可能会产生错误,以及无法预料的后果。所以一般只在自己的程序和模块中使用它,因为这些代码是你可以控制的。
严格模式会对你的代码有显著的影响,其中包括,使用一个变量之前如果不进行定义就会引发错误、一个函数的参数只能被声明一次、你无法在 eval
中使用和 eval
平级的变量等。特别需要大家注意的是,在严格模式中不能使用二进制值。
在前面的内容中,当设定一个文件的权限时,你无法将权限设置为一个八进制值:
"use strict";
var fs = require('fs');
fs.open('./new.txt','a+',0666, function(err, fd) {
if (err) return console.error(err);
fs.write(fd, 'First line', 'utf-8', function(err,written, str) {
if (err) return console.error(err);
var buf = new Buffer(written);
fs.read(fd, buf, 0, written, 0, function (err, bytes, buffer) {
if (err) return console.error(err);
console.log(buf.toString('utf8'));
});
});
});
在严格模式中,这段代码会产生一个语法错误:
fs.open('./new.txt','a+',0666, function(err, fd) {
^^^^
SyntaxError: Octal literals are not allowed in strict mode.
你可以将二进制值转为一个更安全的格式,只需要将前面的 0
替换为 0o
,即一个数字 0
加一个小写字母 o
。设置文件权限时将 0666
改为 0o666
,严格模式的程序才会正常运行。
fs.open('./new.txt','a+',0o666, function(err, fd) {
fs.open()
方法也接受字符串类型的八进制值:
fs.open('./new.txt','a+','0666', function(err, fd) {
但是这个语法实在是不优雅,所以我还是建议使用前面的格式。
在使用一些ES6扩展时,严格模式也是必须的。如果你想使用ES6的类(本章稍后会讲到),那么你必须使用严格模式。同样的,如果你要使用let(后面也会讲到)你也必须使用严格模式。
**讨论一下八进制值** 如果你对八进制值的使用规定有兴趣的话,我建议你看看ES的讨论区:“八进制值是有用的(讨厌UNIX的人请绕行)”。