大小写
ECMAScript中的一切都是区分大小写的,无论是变量操作符还是函数名,如:Typeof 和 typeof 是不一样的
严格模式
ES5中增加,是一种不同的JS解析和执行模型,通过在脚本开头或者函数体内部增加use strict
字符这个预处理指令,开启严格模式,一些不规则的(ECMA3)写法在这里会抛出异常。
设立"严格模式"的目的,主要有以下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
开启严格模式:
- 严格模式通过在脚本或函数的头部添加
use strict
; 表达式来声明。 use strict
并不严格限制一定要写在第一行。前边无产生实际运行结果的语句,use strict
可以不在第一行
// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi! I'm a strict mode script!";
//单独在某个函数内开启严格模式
function a (){
"use strict";
//函数体
}
//use strict可以不在第一行
function(){
"asd";
"use strict";
a = 1;
}
严格模式 vs 正常模式
正常模式 | 严格模式 | |
---|---|---|
一个变量没有声明就赋值 | 默认是全局变量 | 全局变量必须显式声明(先用var命令声明,然后再使用) |
对于静默失败(不报错也没有任何效果)的赋值操作 如:给NaN赋值 | 不给效果也不报错 | 报错 |
试图删除(不可删除的属性/变量/对象/函数)delete Object.prototype; |
不给效果也不报错 | 报错 |
对象有多个重名属性 | 允许重名属性,只有最后一个属性起作用 | 报语法错误 |
函数有多个重名的参数 function f(a, a, b) { return ; } |
可以用arguments[i]读取 | 报语法错误 |
八进制数字语法 | 整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64 | 禁止八进制数字语法,使用会报语法错误 |
严格模式下的eval和arguments
eval
- 变量名不能使用 "eval" 字符串(不能通过程序语法被绑定 (be bound) 或赋值)
"use strict";
var eval = 1; // 报错
- eval作用域: 在eval里面生成的变量只能用于eval内部
"use strict";
var a = 1;
console.info(eval("var a = 2; a")) // 2
console.info(x) //1
eval ("var a = 2");
alert (a); // 报错
arguments
arguments是函数的参数对象
- arguments 不能通过程序语法被绑定 (be bound) 或赋值
"use strict";
arguments++; // 语法错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
- 参数的值不会随 arguments 对象的值的改变而变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]
- 不再支持 arguments.callee
"use strict";
var f = function() { return arguments.callee; };
f(); // 报错
🚨 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上
"use strict";
。
参考资料:
菜鸟教程:https://www.runoob.com/js/js-strict.html
《JavaScript高级程序设计》
MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
阮一峰的网络日志:https://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html