2020-12-19 乐帮网
javascript
"use strict" 表示的是ECMAScript 5中的严格模式。
严格模式是ECMAScript 5中的一项新功能,可让您将程序或功能置于“严格”的语言环境中。这种严格的上下文会阻止采取某些操作,并可能引发更多异常(通常为用户提供更多信息和向下编码的体验)。
由于ECMAScript 5与ECMAScript 3向后兼容,因此,在严格模式下,只是禁用了ECMAScript 3中所有不推荐使用的“功能”(或抛出错误)。
严格模式可以通过以下两种方式提供帮助:
(1)它捕获了一些常见的编码漏洞,并引发异常。当采取相对“不安全”的操作(例如获得对全局对象的访问权限)时,它会抛出错误。
(2)它禁用了部分容易人犯错的功能。有关严格模式的大多数信息可以在第235页的ES5规范[PDF]中找到。
请注意,ECMAScript 5的严格模式不同于Firefox中可用的严格模式(可通过转到about:config并启用javascript.options.strict来启用该模式)。ES5的严格模式下会报出潜在的错误(而Firefox的现有严格模式仅尝试实施一些较好的做法)。
如何启用严格模式?
可以将其放到程序顶部以对整个脚本启用:
function imStrict(){
"use strict";
// ... your code ...
}
仅仅是一个字符串"use strict" 就能启用严格模式在旧版本的浏览器上没有任何效果但也不会报错。
在函数中定义严格模式的一个好处是,您可以以严格的方式定义完整的JavaScript库,而不会影响外部代码。
// Non-strict code...
(function(){
"use strict";
// Define your library strictly...
})();
// Non-strict code...
许多库已经使用了上述技术(使用匿名的自执行功能包装整个库),它们将能够非常轻松地利用严格模式。
那么,严格模式下会发生什么变化?有很多东西。
变量和属性
在脚本中执行 foo = "bar"; 如何我们显示未定义"foo"则将执行失败。以前的话,它会将值分配给全局对象的foo属性(例如window.foo),现在会抛出异常。
当我们尝试给只读属性赋值时,或者删除一个Object自带属性时,或者在系统不允许的对象上添加属性都会引发错误,以前它们只会静默失败。
例如以下情况会导致错误。
var foo = "test";
function test(){}
delete foo; // Error
delete test; // Error
function test2(arg) {
delete arg; // Error
}
在对象文字中多次定义属性会导致引发异常
// Error
{ foo: true, foo: false }
eval
几乎禁止使用名称"eval"的任何尝试,也禁止将eval函数分配给对象的变量或属性的功能。
// All generate errors...
obj.eval = ...
obj.foo = eval;
var eval = ...;
for ( var eval in ... ) {}
function eval(){}
function test(eval){}
function(eval){}
new Function("eval")
此外,将阻止尝试通过eval引入新变量。
eval("var a = false;");
print( typeof a ); // undefined
函数相关
尝试覆盖arguments对象将导致错误:
arguments = [...]; // not allowed
定义同名参数将导致错误function( foo, foo ) {}。
访问arguments.caller并arguments.callee现在引发异常。因此,您要引用的任何匿名函数都需要命名,如下所示:
setTimeout(function later(){
// do stuff...
setTimeout( later, 1000 );
}, 1000 );
其他功能的arguments和caller属性不再存在并且禁止定义它们。
function test(){
function inner(){
// Don't exist, either
test.arguments = ...; // Error
inner.caller = ...; // Error
}
}
这个其实是有好处的它可以解决以下问题:将避免null或undefined强制变为全局对象。严格模式下可以防止这种情况的发生。
(function(){ ... }).call( null ); // Exception
with(){}
with(){} 在启用严格模式后,这样的语句被认为是语法错误。
在ECMAScript 5严格模式和正常模式有以上不同点,它对我们使用脚本开发有很大的影响,愿开发人员能习惯并且喜欢这种模式。
链接:https://johnresig.com/blog/ecmascript-5-strict-mode-json-and-more/
相关文章:
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力