JavaScript use strict 是什么?

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/

相关文章:

JavaScript 如何从数组中删除指定项目?

JavaScript 操作 Cookie

JavaScript use strict 是什么?

js 选择打印区域

JS 完美判断页面是否在移动端打开

js 重定向 页面怎么写?

纯js日期控件 可以自定义样式

HTML中JS操作DOM样式Style对照表

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力