JavaScript中使用“严格”做什么,背后的原因是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中使用“严格”做什么,背后的原因是什么?相关的知识,希望对你有一定的参考价值。
最近,我通过Crockford的JSLint运行了一些我的javascript代码,它给出了以下错误:
第1行问题1:缺少“使用严格”声明。
做一些搜索,我意识到有些人将"use strict";
添加到他们的JavaScript代码中。一旦我添加了语句,错误就会停止显示。不幸的是,谷歌没有透露这个字符串声明背后的历史。当然它必须与浏览器如何解释JavaScript有关,但我不知道效果会是什么。
那么什么是"use strict";
,它意味着什么,它仍然相关吗?
当前的任何浏览器都会响应"use strict";
字符串,还是将来使用?
这篇关于Javascript Strict Mode的文章可能会让您感兴趣:John Resig - ECMAScript 5 Strict Mode, JSON, and More
引用一些有趣的部分:
严格模式是ECMAScript 5中的一项新功能,允许您在“严格”操作上下文中放置程序或函数。这种严格的上下文阻止了某些操作被采取并引发更多异常。
和:
严格模式有两种方式:
- 它捕获了一些常见的编码bloopers,抛出异常。
- 当采取相对“不安全”的操作(例如获取对全局对象的访问权限)时,它会阻止或抛出错误。
- 它禁用令人困惑或思索不周的功能。
另请注意,您可以对整个文件应用“严格模式”...或者您只能将其用于特定功能(仍然引用John Resig的文章):
// Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code...
如果你必须混合旧代码和新代码,这可能会有所帮助;-)
所以,我认为它有点像你可以在Perl中使用的"use strict"
(因此名称?):通过检测更多可能导致破坏的事情,它可以帮助您减少错误。
严格的模式现在是supported by all major browsers。如果您在native ECMAScript modules中编写JavaScript(使用import
和export
语句),则始终启用严格模式,并且无法禁用。
如果您使用过去一年左右发布的浏览器,那么它很可能支持JavaScript Strict模式。只有在ECMAScript 5成为当前标准之前的旧浏览器才支持它。
命令周围的引号确保代码仍然可以在旧版浏览器中工作(尽管在严格模式下生成语法错误的事情通常只会导致脚本在这些旧版浏览器中以某种难以检测的方式出现故障)。
添加"use strict";
时,以下情况将在脚本执行之前抛出SyntaxError:
- 为未来的ECMAScript版本铺平了道路,使用了一个新保留的关键字(在ECMAScript 6预设中):
implements
,interface
,let
,package
,private
,protected
,public
,static
和yield
。 - 在块中声明功能
if(a<b){ function f(){} }
- 八进制语法
var n = 023;
this
指向全球对象。function f() { "use strict"; this.a = 1; }; f();
- 为对象文字中的属性名称声明两次相同的名称
{a: 1, b: 3, a: 7}
在ECMAScript 6(bug 1041128)中不再是这种情况。 - 使用相同的名称函数声明两个函数参数
f(a, b, b){}
- 将值设置为未声明的变量
function f(x){ "use strict"; var a = 12; b = a + x*35; // error! } f();
- 在变量名
delete
上使用delete myVariable;
- 使用
eval
或arguments
作为变量或函数参数名称"use strict"; arguments++; var obj = { set p(arguments) { } }; try { } catch (arguments) { } function arguments() { }
资料来源:
- MDN上的Transitioning to strict mode
- MDN上的Strict mode
- 关于Colin J. Ihrig博客的JavaScript’s Strict Mode and Why You Should Use It(存档版)
严格模式对常规JavaScript语义进行了一些更改:
- 通过更改它们以抛出错误来消除一些JavaScript无声错误。
- 修复了使JavaScript引擎难以执行优化的错误。
- 禁止在ECMAScript的未来版本中定义某些语法。
欲了解更多信息,请访问qazxsw poi
“使用严格”;是程序员不会使用JavaScript的松散或不良属性的保险。这是一个指南,就像一个统治者将帮助你做直线。 “使用严格”将帮助您进行“直接编码”。
那些不想使用统治者直接行直线的人通常会在那些要求其他人调试代码的页面中结束。
相信我。与设计不良的代码相比,开销可以忽略不计。 Strict Mode- Javascript。就个人而言,我喜欢一直回到他的网站,以确保我不忘记我的良好做法。
现代JavaScript实践应该总是唤起“使用严格”;附注。 ECMA集团选择“严格”模式的唯一原因是允许经验较少的编码人员访问JavaScript,然后有时间适应新的更安全的编码实践。
从这一点开始,在所有敏感JavaScript文件的开头包含Doug Crockford, who has been a senior JavaScript developer for several years, has a very interesting post here是一个很好的方法,可以成为一个更好的JavaScript程序员,并避免随机变量变为全局变量,并且事情会发生变化。
use strict
:
“使用严格”指令
“use strict”指令是JavaScript 1.8.5(ECMAScript版本5)中的新指令。
它不是一个语句,而是一个文字表达式,被早期版本的JavaScript忽略。
“use strict”的目的是表明代码应该以“严格模式”执行。
例如,使用严格模式,您不能使用未声明的变量。
为何选择严格的模式?
严格模式可以更轻松地编写“安全”JavaScript。
严格模式将以前接受的“错误语法”更改为实际错误。
例如,在普通的JavaScript中,错误输入变量名称会创建一个新的全局变量。在严格模式下,这将引发错误,从而无法意外创建全局变量。
在普通的JavaScript中,开发人员不会收到任何错误反馈,将值分配给不可写属性。
在严格模式下,对非可写属性,仅getter属性,不存在的属性,不存在的变量或不存在的对象的任何赋值都将引发错误。
请参阅Quoting from w3schools了解更多信息
http://www.w3schools.com/js/js_strict.asp使JavaScript代码以严格模式运行,这基本上意味着在使用之前需要定义所有内容。使用严格模式的主要原因是避免未定义方法的意外全局使用。
在严格模式下,事情运行得更快,一些警告或无声警告会导致致命错误,最好总是使用它来制作更整洁的代码。
"use strict"
在ECMA5中被广泛使用,在ECMA6中它默认是JavaScript的一部分,所以如果你使用ES6则不需要添加它。
查看MDN的这些陈述和示例:
“使用严格”指令 “use strict”指令是JavaScript 1.8.5(ECMAScript版本5)中的新指令。它不是一个语句,而是一个文字表达式,被早期版本的JavaScript忽略。 “use strict”的目的是表明代码应该以“严格模式”执行。例如,使用严格模式,您不能使用未声明的变量。
使用“use strict”的例子: 函数的严格模式:同样,要为函数调用严格模式,请输入确切的语句“use strict”; (或'use strict';)在任何其他语句之前在函数体中。
1)功能严格模式
"use strict"
2)全脚本严格模式
function strict() {
// Function-level strict mode syntax
'use strict';
function nested() { return 'And so am I!'; }
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() { return "I'm not strict."; }
console.log(strict(), notStrict());
3)分配给不可写的全局
'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);
你可以'use strict';
// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError
// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError
// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError
// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError
。
有一些人参加了ECMAScript委员会的讨论:read more on MDN关于Changes to JavaScript, Part 1: ECMAScript 5"交换机的增量使用如何允许JavaScript实施者清理JavaScript的许多危险特性而不会突然破坏世界上的每个网站。
当然,它还讨论了很多这些错误信息是什么以及ECMAScript 5如何修复它们。
请注意,"use strict"
是在use strict
中引入的,并且从那时开始保存。
以下是在EcmaScript 5和ES6中触发严格模式的条件:
- 全局代码是严格模式代码,如果它以包含使用严格指令的指令序言开头(见14.1.1)。
- 模块代码始终是严格的模式代码。
- ClassDeclaration或ClassExpression的所有部分都是严格模式代码。<
以上是关于JavaScript中使用“严格”做什么,背后的原因是什么?的主要内容,如果未能解决你的问题,请参考以下文章