协慌网

登录 贡献 社区

JavaScript 中使用 “严格” 做什么,背后的原因是什么?

最近,我通过 Crockford 的JSLint运行了一些我的 JavaScript 代码,它给出了以下错误:

第 1 行问题 1:缺少 “使用严格” 声明。

做一些搜索,我意识到有些人加上"use strict";进入他们的 JavaScript 代码。一旦我添加了语句,错误就会停止显示。不幸的是,谷歌没有透露这个字符串声明背后的历史。当然它必须与浏览器如何解释 JavaScript 有关,但我不知道效果会是什么。

那么什么是"use strict";一切,它意味着什么,它仍然相关吗?

当前任何浏览器都会响应"use strict";字符串或将来使用?

答案

这篇关于 Javascript Strict Mode 的文章可能会让您感兴趣: John Resig - ECMAScript 5 Strict Mode,JSON 等

引用一些有趣的部分:

严格模式是 ECMAScript 5 中的一项新功能,允许您在 “严格” 操作上下文中放置程序或函数。这种严格的上下文阻止了某些操作被采取并引发更多异常。

和:

严格模式有两种方式:

  • 它捕获了一些常见的编码 bloopers,抛出异常。
  • 当采取相对 “不安全” 的操作(例如获取对全局对象的访问权限)时,它会阻止或抛出错误。
  • 它会禁用令人困惑或经过深思熟虑的功能。

另请注意,您可以对整个文件应用 “严格模式”... 或者您只能将其用于特定功能(仍然引用 John Resig 的文章)

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

如果你必须混合旧代码和新代码,这可能会有所帮助;-)

所以,我认为它有点像你可以在 Perl 中"use strict""use strict" (因此名称?) :通过检测更多可能导致破坏的事情,它可以帮助您减少错误。

目前,它受到所有主流浏览器支持 (IE 9 及以下版本)

这是 ECMAScript 5 的一个新功能. John Resig 写了一个很好的摘要

它只是一个放在 JavaScript 文件中的字符串(位于文件顶部或函数内部),如下所示:

"use strict";

现在将它放在你的代码中不应该导致当前浏览器出现任何问题,因为它只是一个字符串。如果您的代码违反了编译指示,将来可能会导致您的代码出现问题。例如,如果您当前有foo = "bar"而没有先定义foo ,那么您的代码将开始失败...... 在我看来这是一件好事。

声明"use strict";指示浏览器使用严格模式,这是一种简化且更安全的 JavaScript 功能集。

功能列表(非详尽)

  1. 不允许全局变量。 (在变量名中捕获缺少的var声明和拼写错误)

  2. 无提示失败的分配将在严格模式下抛出错误(指定NaN = 5;

  3. 尝试删除不可删除的属性将抛出( delete Object.prototype

  4. 要求对象文字中的所有属性名称都是唯一的( var x = {x1: "1", x1: "2"}

  5. 函数参数名称必须唯一( function sum (x, x) {...}

  6. 禁止八进制语法( var x = 023;一些开发人员错误地认为前面的零不会改变数字。)

  7. 禁止使用with关键字

  8. 严格模式下的eval不会引入新变量

  9. 禁止删除普通名称( delete x;

  10. 禁止以任何形式绑定或赋值名称evalarguments

  11. 严格模式不会使用形式参数别名arguments对象的属性。 (即function sum (a,b) { return arguments[0] + b;}这是有效的,因为arguments[0]绑定到a等等。)

  12. arguments.callee不受支持

[参考: 严格模式Mozilla 开发者网络 ]