javascript - "use strict"在JavaScript中起什么作用?

  显示原文与译文双语对照的内容

最近,我跑我的一些javascript代码通过 crockford JSLint,它给了以下错误:

第 1行字符 1出现问题: 缺少"使用严格"语句。

做一些搜索,我意识到一些人在他们的JavaScript代码中添加了 "use strict"; 。 添加语句后,出现了错误。 不幸的是,谷歌没有揭示这个字符串语句背后的很多历史。 当然,它一定与浏览器解释JavaScript的方式有关,但我不知道效果是什么。

那么 "use strict"; 是什么意思,它意味着什么,它还相关?

当前的浏览器是否对 "use strict"; 字符串做出响应,或者是否用于将来使用?

时间:

本文关于你可能感兴趣: Resig - ECMAScript 5严格模式,JSON和更多的

引用一些有趣的部分:

Strict模式是 ECMAScript 5中的一个新特性,它允许你在"严格"操作环境中放置程序或者函数。 这里严格上下文防止采取某些操作并引发更多异常。

还有:

Strict模式以几种方式帮助:

  • 它捕获了一些常见的代码 Fragment,抛出异常。
  • 当执行相对"不安全"操作时,它可以防止或者抛出错误。
  • 它禁用了那些混乱或者被认为不正确的特性。

同时注意你可以将"strict模式"应用到整个文件。。 或者你只能将它用于特定的function (still quoting from John Resig's article):


//Non-strict code...

(function(){
"use strict";

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

//Non-strict code... 

如果你必须混合旧代码和新代码,这可能很有用;- )

所以,我想这有点像 "use strict" 可以使用perl ( 因此名称) :? 通过检测可能导致破坏的更多内容,它可以帮助你减少错误。

目前,它是支持所有主流浏览器

这是 ECMAScript 5的新特性。 John Resig编写了的一个不错的摘要。

它只是你放入JavaScript文件( 位于文件顶部或者函数内部)的字符串,看起来像这样:

 
"use strict";

 

现在将它放入代码中不会引起当前浏览器的任何问题,因为它只是一个字符串。 如果代码违反了杂注,将来可能会导致代码问题。 例如如果你当前有 foo ="bar" 而没有定义 foo,你的代码将开始失败。这在我看来是一件好事。

如果人们担心使用 use strict,可能值得检查本文:

http://www.novogeek.com/post/ECMAScript-5-Strict-mode-support-in-browsers-What-does-this-mean.aspx

讨论浏览器支持,但更重要的是如何安全地处理它:


function isStrictMode(){
 return!this;
} 
//returns false, since 'this' refers to global object and '!this' becomes false

function isStrictMode(){ 
"use strict";
 return!this;
} 
//returns true, since in strict mode, the keyword 'this' does not refer to global object, unlike traditional JS. So here,'this' is null and '!this' becomes true.

警告一句,所有你hard-charging程序员: 将"使用严格"应用到现有代码可能是危险的 ! 这不是一些 feel-good,happy-face贴纸,你可以点击它来使它成为'更佳'。 "使用严格"编译指示,浏览器将在随机的地方突然抛出异常,从未把仅仅因为发现你做的事情违约/松javascript愉快地允许但严格javascript abhors ! 你可能已经严格违反躲在很少使用在代码中调用,只会抛出一个异常当最终成功运行——比如说,在生产环境中,你的付费用户使用!

如果你要冒险,这是一个好主意来应用"使用严格"与全面的单元测试和严格配置JSHint构建任务,会给你一些信心,没有黑暗的角落里的模块炸毁可怕的只是因为你有打开严格模式。 或者,还有一个选项: 不要将"使用严格"添加到任何遗留代码中,这样可能更安全。 绝对不要将"使用严格"添加到你不拥有或者维护的模块,如第三方模块。

我认为即使它是一个致命的动物,"使用严格"也可以是好东西,但你必须做正确的事情。 最好的时候是当你的项目是新的并且你开始从头开始时。 配置 jshint/jslint所有的警告和选项调紧,你的团队可以胃,得到一个好的像 Grunt+Karma+Chai build/test/assert 系统的操纵,也只有到那时开始"使用严格"标记所有你的新模块。 准备纠正大量niggly错误和警告。 如果 jshint/jslint产生任何违规,请确保每个人通过配置构建来理解重力。

当我采用"使用严格"时,我的项目不是一个新项目。 因此,我的IDE中充满了红色标记,因为我的模块上没有"使用严格",JSHint抱怨。 这是对我将来应该做什么的提醒。 我的目标是因为我所有的"使用严格"语句都是免费的,但这已经过时了。

"use strict"; 指示浏览器使用严格模式,这是一个减少和安全的javascript特性集。

特性列表( 非详尽)

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

  2. 静默失败的赋值将在严格模式下抛出错误( assigning NaN = 5; )

  3. 试图删除undeletable属性将抛出( delete Object.prototype )

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

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

  6. 禁止八进制语法( var x = 023;//some devs assume wrongly that a preceding zero does nothing to change the number. )

  7. 严格模式下不允许 with 关键字 eval 引入新变量

  8. 不允许删除普通名称( delete x; )

  9. 不允许在任何形式中绑定或者赋值名称'评估'和'实参'

  10. Strict模式不使用形参来别名对象的属性。 ( 例如 ) function sum (a,b) { return arguments[0] + b;} 这是因为参数 [0] 绑定到了。 )

  11. 不支持 arguments.callee

[ 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode ]

我强烈建议每个开发者立即使用严格模式。 有足够的浏览器支持它,严格模式将合法地帮助我们避免我们甚至不知道的错误。

很明显,在初始阶段,我们会遇到以前从未遇到过的错误。 为了获得充分的好处,我们需要在切换到严格模式后进行适当的测试以确保我们已经捕捉到了所有的东西。 当然,我们不只是在代码中抛出英镑的"使用严格",并假设没有错误。 所以现在是时候开始使用这个非常有用的语言特性来编写更好的代码了。

比如,


var person = {
 name : 'xyz',
 position : 'abc',
 fullname : function () {"use strict"; return this.name; }
};

网格是由 Douglas Crockford编写的调试器。 简单地粘贴你的脚本,它会快速扫描你代码中出现的任何问题和错误。

如果你使用了去年发布的浏览器,那么它很可能支持JavaScript严格模式。 在 ECMAScript 5之前,只有旧的浏览器变成了当前标准不支持它。

命令周围的引号确保代码仍然可以在旧的浏览器中运行,也可以使用( 虽然生成语法错误的事情在严格模式一般只会导致脚本故障在一些难以探测的方式在这些老的浏览器) 。

我的两美分:

严格模式的一个目标是允许更快地调试问题。 当发生某些错误的情况时,它会帮助开发人员抛出异常,这会导致你的网页的&奇怪行为。 当我们使用 use strict 时,代码会抛出错误,帮助开发者提前修复它。

在使用 use strict 之后,我学到了一些重要的东西:

可以防止全局变量声明:


var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
 var age;
 var leafCount;

 age = typeOfTree.age;
 leafCount = typeOfTree.leafCount;
 nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

现在,这里代码在全局作用域中创建 nameoftree,可以使用 window.nameoftree 访问它。 当我们实现 use strict 时,代码会抛出错误。

未捕获的ReferenceError: nameoftree未定义

样本

可以消除 with 语句:

with 语句不能使用 uglify-js 之类的工具缩小。 它们也是过时的,并从未来的JavaScript版本中删除。

样本

防止重复:

当我们有重复属性时,它抛出一个异常

未捕获的SyntaxError: 严格模式下不允许对象文本中的重复数据属性


"use strict";
var tree1Data = {
 name: 'Banana Tree',
 age: 100,
 leafCount: 100000,
 name:'Banana Tree'
};

除了我需要更多的知识。

要为整个脚本调用严格模式,请在任何其他语句之前放置精确的语句 "use strict"; ( 或者 'use strict'; ) 。


//Whole-script strict mode syntax
"use strict";
var v ="Hi! I'm a strict mode script!";

这里语法有一个已经被主要站点咬伤的陷阱: 不能盲目地连接non-conflicting脚本。 考虑将严格模式脚本与non-strict模式脚本连接: 整个连接看起来很严格 ! 反转也是: non-strict加严格外观 non-strict 。 互相串联严格模式脚本是很好的,并且non-strict模式脚本的串联是很好的。 只有连接严格和non-strict脚本才有问题。 因此建议你在function-by-function基础上启用严格模式。

你还可以将脚本的全部内容包装在函数中,并使外部函数使用严格模式。 这消除了串联问题,但这意味着你必须显式地从函数作用域中导出任何全局变量。

"使用严格";程序员不会使用JavaScript的松散或者不正确的属性。 这是个指南,就像尺子能帮你画直线一样。 "使用严格的"将帮助你做"直编码"。

那些不喜欢使用统治者进行连续线通常在这些页面要求别人来调试代码。

相信我,与设计拙劣的代码相比,开销是微不足道的。 Doug Crockford高级javascript开发人员已经好几年了,有一个非常有趣的帖子 。 就我个人而言,我喜欢回到他的网站,以确保我不会忘记我的良好实践。

的现代JavaScript实践应该总是唤起"使用严格";杂注。 ecma集团的唯一原因使得"严格"模式可选允许缺乏经验的程序员访问javascript和给时间来适应新的和更安全的编码实践。

...