本文概述
- 防止对象重复
- 禁止使用with陈述式
- 防止全局变量声明
- 禁止将保留关键字用作变量名
- 将参数作为标识符或修改Arguments变量
- 在eval函数中声明的变量
- 禁止八进制语法
- 扩展不可扩展的对象属性
- 支持的浏览器
严格模式对解释器处理Javascript的方式进行了几处更改。严格模式通过将它们更改为引发错误来消除一些JavaScript静默错误。严格模式可修复导致JavaScript引擎难以执行优化的错误:有时可以使严格模式代码比非严格模式下的相同代码运行得更快, 并且禁止在将来的ECMAScript版本中定义某些语法(例如, 类等) 。
严格模式适用于整个脚本或单个功能。它不适用于{}中包含的语句块;尝试将其应用于此类上下文不会执行任何操作。基本上, strict的用途是在代码中引入更好的错误检查。
可以启用严格模式, 在脚本” use strict”的顶部添加具有以下内容的字符串;即:
在脚本标签或引用的文件上:
<script>
"use strict";
// Execute some script strictly
</script>
功能上(匿名或非匿名)
(function(){"use strict";
// All the code will be analyzed in strict mode
})();
function myAction(){
"use strict";
// Threat me strictly
}
防止对象重复
以下对象具有2个具有相同名称的属性:
var myObject = {
hello:"A string", anotherProperty:2, other:"Hi", hello:"A string"
};
如果没有严格模式, 则对象将具有属性, 但具有最新的声明值。在严格模式下, js解释器将抛出严格模式下不允许的对象常量中的Uncaught SyntaxError:Duplicate data属性。
禁止使用with陈述式
在严格模式下使用with语句:
"use strict";
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
将抛出Uncaught SyntaxError:严格模式代码可能不包含with语句。不建议使用with语句, 因为它可能导致令人困惑的错误和兼容性问题。
防止全局变量声明
不允许在范围内声明全局变量, 例如:
var history = [];
function ExecuteSomething(message){
// Note that the code doesnt use => var toSaveInHistory, therefore there is an error
toSaveInHistory = message;
return console.log(message);
}
ExecuteSomething("My custom log");
先前的代码将引发Uncaught ReferenceError:未定义toSaveInHistory, 因为确实没有在闭包中声明toSaveInHistory。严格模式禁止隐式创建全局属性。
禁止将保留关键字用作变量名
使用将来的保留字作为标识符是无效的。标识符名称在严格模式下保留, 即:
- 实施
- 接口
- 包
- private
- protected
- public
- static
- 让
将参数作为标识符或修改Arguments变量
在严格模式下, 变量” arguments”(在所有函数中均被标识为数组, 该变量包含已发送给函数执行的所有参数, 请在此处详细了解参数变量的工作原理)不能用作标识符(变量或函数名, 参数名, 等等)也不会更改局部参数对象的成员的值, 即:
"use strict";
var arguments = "something";
// Throws => Invalid usage of 'arguments' in strict mode
// or
function executeSomething(age, name){
arguments[0] = 12;
return true;
}
executeSomething(15, "Batman");
在eval函数中声明的变量
如果在eval函数内部声明了变量, 则不能在该函数外部使用该变量, 即:
eval("var myVariable = 10;");
document.write(myVariable);
之前的代码抛出” myVariable”是未定义的。
禁止八进制语法
不允许将八进制值分配给数字文字, 或尝试对八进制值使用转义符, 即:
var myOctal = 012;
var myEscapedOctal = \012;
前面的代码抛出严格模式下不允许的八进制数字文字和转义字符。
扩展不可扩展的对象属性
如果没有严格模式, 则许多事情都会被静默忽略, 因为将属性添加到不可扩展的对象不会产生任何效果。但是, 如果启用了严格模式, 则会出现异常, 即:
var myItem = {};
Object.preventExtensions(myItem);
myItem.otherProperty = 222;
前面的代码抛出”无法为不可扩展对象创建属性”。
支持的浏览器
当前所有主要浏览器(不包括IE 9和更低版本)都支持使用strict。有关更多信息, 请参阅我可以使用use strict。但是, 在Web上有很多地方, 他们会告诉你在ie8或9中使用严格模式不是问题, 如果你仍然怀疑的话, 请相信microsoft:
评论前必须登录!
注册