"use strict";
var x = 010; //正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。
var x = \010; //非引号内只支持'\u'前缀的两种转义字符(\u{7A} \u007A),不支持无前缀和'\x'前缀的转义字符('\z' '\172' '\x7A');
x = 3.14; //不允许在未声明标识名的情况下使用标识名
var x = 3.14;
delete x;//不允许删除以声明方式创建的标识名(变量声明,函数声明),只可删除对象的属性
function x(p1, p1) {};//不允许重复参数名
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; //不允许给只读属性赋值
var obj = {get x() {return 0} };
obj.x = 3.14; //不允许为只能获取的属性赋值
delete Object.prototype; //不允许删除不可删除的属性,比如内置对象
var eval = 3.14; //保留字不能作为变量名,只可作为属性
var arguments = 3.14; //内置对象不能作为变量名,只可作为属性
this;//严格模式中,顶层作用域中this的值不再是全局对象,此时它的值为 undefined。
eval ("var x = 2");
alert (x); //eval()创建的变量只能在eval内使用
with (Math){x = cos(2)}; //不允许使用with语句
__局部模式__
//类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。
x = 3.14; // 这不会引发错误
myFunction();
function myFunction() {
"use strict";//函数内部可以设定为严格模式。
y = 3.14; // 这会引发错误
};
const doSomething = function ({a=3, ...b}) {
'use strict';
};
//只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。
第一种:全局性的严格模式;
'use strict';
function doSomething(a, b = a) {
// code
}
第二种:把函数包在一个无参数的立即执行函数里面;
const doSomething = (function () {
'use strict';
return function(value = 42) {
return value;
};
}());
//两种方法可以规避这种限制
function inner(){
console.log(arguments.callee.caller);
};
//严格模式下,arguments及其属性皆不可访问
function restricted() {
"use strict";
restricted.caller; // 报错
restricted.arguments; // 报错
};
//尾调用优化只在严格模式下开启,正常模式下的caller和arguments可跟踪函数的调用栈,故此两者在严格模式下不可用。
保留关键字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留关键字:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
本文参考知乎
八进制禁止部分的解析参考: