最近,我通过克罗福德 查了一些JavaScript代码JSLint JSLint,并给出了以下错误:
第1行第1字符1:缺少“严格使用”声明的问题。
在做一些搜索时,我意识到有些人加了"use strict";
输入 JavaScript 代码。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并未披露此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读 JavaScript 有关, 但我不知道效果会是什么 。
那么,什么是"use strict";
关于它的意义是什么,它是否仍然相关?
当前浏览器中的任意浏览器响应"use strict";
字符串, 还是用于未来用途 ?
我的两分钱:
严格模式的目标之一是允许更快地调试问题。 它有助于开发者, 当某些错误的事情发生时, 可能导致您网页的沉默和奇怪行为时, 将例外丢弃给开发者 。 我们使用的时间 use strict
,代码将排除错误,帮助开发者提前修正错误。
使用后我学到的几件重要东西 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
代码会丢出错误 。
未标记引用错误: 未定义树名
消除 " 消除 "with
语句:
with
无法使用工具例如微克- js。它们也是折旧从未来的 JavaScript 版本中删除 。
样本 :
"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;
for (var i = 0; i < 2; ++i) {
// let(leafCount = i) { /*do something*/ }
}
for (var i = 0; i < 2; ++i) {
with(leafCount = i) { /*do something*/ }
}
};
var tree1 = new Tree(tree1Data);
console.log(window);
防止重复:
当我们有重复财产时,它会提出一个例外
未标记的语法错误: 严格方式不允许以对象文字复制数据属性
"use strict";
var tree1Data = {
name: 'Banana Tree',
age: 100,
leafCount: 100000,
name:'Banana Tree'
};
几乎没有更多的人,但我需要获得更多这方面的知识。
“ 严格使用 ” ; 定义 JavaScript 代码应以“ 限制模式” 执行 。
- ECMAScript 5版的新指令是“严格使用”指令。
- 它不是一种声明,而是一种字面表达,被以前版本的JavaScript所忽视。
- “严格使用”的目的是表示代码应以“严格模式”执行。
- 在严格模式下,您不能使用未声明的变量。
所有现代浏览器支持“ 严格使用 ” , 除非因特网探索者 9 及以下.
缺点
如果开发商使用一个严格模式的图书馆, 但开发商通常使用正常模式,
更糟糕的是,由于开发商处于正常模式,他们没有被抛出额外错误的好处,因此错误可能会无声无息地失败。
此外,如上所列,严格模式阻止你做某些事情。
但有些开发商不喜欢这种限制, 并想使用语言的所有特征。
如果人们担心使用use strict
也许值得看看这篇文章:
在浏览器中支持 ECMAScript 5 “ 立体模式” 。 这是什么意思 ?
NovoGeeek.com - 克里希纳的博客
讨论浏览器支持, 但更重要的是如何安全处理:
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 'undefined' and '!this' becomes true.
*/
"use strict"
使 JavaScript 代码运行到严格限制模式使用严格模式的主要原因是避免意外地在全球使用未定义的方法。
严格地说,事情跑得更快, 一些警告或无声警告 扔出致命错误, 最好总是用它来做一个更干净的代码。
"use strict"
EECMA5广泛需要广泛使用。在 ECMA6 中它默认为 JavaScript 的一部分,所以如果你使用ES6, 不需要添加。
看看这些声明和MDN的例子:
“严格使用”指令
JavaScript 1. 8.5 (ECMAScript 版本 5) 的“ 严格使用” 指令是新的 JavaScript 1. 8.5 (ECMAScript 版本 5) 。 它不是一个声明,而是一个字面表达, 先前版本的 JavaScript 忽略了它。 “ 严格使用” 的目的是表示代码应在“ 严格模式” 中执行。 例如, 严格模式下, 您不能使用未声明的变量 。
使用“ 严格使用” 的例子 :
功能的严格模式 : 同样, 要对函数使用严格的方式, 请在函数的正文中将确切的语句“ 使用严格 ” ; (或“ 使用严格 ” ) 置于任何其他语句之前 。
(1) (1) 功能的严格模式
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());
2) 完全上标的严格模式
'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);
(3) (3) 转让给不可撤销的全球转让
'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
你可以MDN 上更多读取.