最近,我通过克罗福德 查了一些JavaScript代码JSLint JSLint,并给出了以下错误:
第1行第1字符1:缺少“严格使用”声明的问题。
在做一些搜索时,我意识到有些人加了"use strict";
输入 JavaScript 代码。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并未披露此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读 JavaScript 有关, 但我不知道效果会是什么 。
那么,什么是"use strict";
关于它的意义是什么,它是否仍然相关?
当前浏览器中的任意浏览器响应"use strict";
字符串, 还是用于未来用途 ?
我想提出一个更有根据的答案来补充其他答案。 我希望编辑最受欢迎的答案,但失败了。 我试图尽可能全面和完整地完成它。
您可以引用MDN 文件供参考。
"use strict"
ECMAScript 5中引入的一项指令。
指令与声明相似,但不同。
use strict
关键词不包含关键词:指令是一个简单的表达式声明,由特殊的字符串字典(单引或双引号)组成。 JavaScript 引擎,不执行ECMAScript 5, 只需看到表达式声明而无副作用。预计未来版本的ECMAScript 标准会引入。use
作为真正的关键词;引号将因此过时。
use strict
只能在脚本或函数的开头使用, 即它必须先于所有其他( 真实的) 语句。 它不必是函数脚本的第一个指令 : 它可以在它之前加上由字符串字典组成的其他语句表达式( JavaScript 执行可以视为执行特定指令 ) 。 字符串语句( 脚本或函数中) 后面的第一个真实语句是简单的表达式语句。 口译员不能把它们解释为指令, 它们没有效果 。
缩略use strict
指令指示表示以下代码(在脚本或函数中)是严格的代码。当脚本包含use strict
指令。当函数本身在严格代码中定义函数本身时,或当函数包含use strict
指令。eval()
当下列情况中,当eval()
被严格法典或包含use strict
指令本身。
ECMAScript 5的严格模式是JavaScript语言的一个限制性子集,它消除了有关语言的缺陷,并具有更严格的错误检查和安全性。
- 您不能使用
with
- 严格声明
- 在严格模式下,所有变量都必须声明:如果给尚未被宣布为变量、功能、功能参数、抓抓圈参数或全球属性的标识符指定值,则必须声明所有变量。
Object
,然后你会得到ReferenceError
。在正常模式中,标识符被隐含地宣布为全球变量(作为全球属性的属性)Object
)
- 在严格模式中关键字
this
值undefined
在函数中被援引为函数的函数(不是方法)。 (以正常模式)this
总是指向全球Object
这种差异可用于测试执行是否支持严格的模式:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
同样,在援引一项职能时,call()
或apply
严格的方式,然后this
正好是call()
或apply()
引用。 (以正常模式)null
和undefined
被全局替换为全局Object
非对象的数值被投入对象。 )
严格的方式,你会得到TypeError
,当您试图为非扩展对象指定只读属性或定义新属性时。(在正常模式中,两个都只是没有错误消息的失败。)
严格的方式,当通过代码到eval()
中,您无法在调用者的范围内声明或定义变量或函数(您可以在正常模式下这样做)。相反,为eval()
以及变量和函数属于这一范围。eval()
完成执行。
在严格模式下,函数的参数对象包含一个数值的静态副本,这些数值被传递到该函数。在正常模式下,参数对象具有某种“磁性”行为:数组的元素和命名的函数参数同时引用相同的值。
严格的方式,你会得到SyntaxError
时当delete
运算符后面有一个不合格的标识符(变量、函数或函数参数)。在正常模式中delete
表达式不会做任何事情,并且被评价为false
.
严格的方式,你会得到TypeError
当您试图删除一个不可配置的属性时。 (在正常模式中,尝试失败和delete
表达式被评价为false
).
在严格模式下,当您试图用相同名称来定义一个对象字面上的多个属性时,它就被视为一种同义错误。 (在正常模式下,没有错误。 )
在严格模式下,当函数声明含有相同名称的多个参数时,该函数声明被视为一种同义错误。 (在正常模式下,没有错误。 )
在严格模式下,不允许使用八字字词(这些是开头的字词)0
。(在正常模式中,有些执行允许八字行。)
在严格的模式下,标识符eval
和arguments
被处理为关键字。您不能改变它们的值,不能给它们指定一个值,也不能用它们来命名一个抓取区块的变量、函数、函数参数或识别符号。
严格地说,检查电话亭的可能性受到更多的限制。arguments.caller
和arguments.callee
原因 a/TypeError
此外,在严格模式下,某些调用人和参数的函数属性导致TypeError
当你试着读的时候
JavaScript由于浏览器战争和管理不善而匆忙设计和实施,导致许多设计决定不善,不直观的语法和混乱的语义被混为一谈。 严格模式旨在修正其中的一些错误。
但是,在不创造替代解释的情况下纠正这些错误会打破后向兼容性。所以,"use strict"
指令规定对代码的替代解释,同时将其告知程序员。
例如,this
关键字在方法定义中指向对象,例如this
或self
以其他语文提供。
let o = {
name: 'John Doe',
sayName: function(){
console.log(this.name);
}
};
o.sayName(); // 'John Doe'
this
方法上下文外没有目的,但所有 JavaScript 函数都具有this
关键字是否为方法 :
function run() {
console.log(this);
}
run(); // Window
给this
确定全球对象,因为全球对象在范围中已经存在,所以它毫无意义,没有意义。
严格方式this
在一个全球职能中,我们决心作出不确定的决定,这正是我们所期望的。
"use strict"
function run() {
console.log(this);
}
run(); // undefined
有些错误即使严格的方式也无法固定,因为语法对旧浏览器应该有效,因为它们忽略了"strict mode"
这是按设计设计的指令。
我的两分钱:
严格模式的目标之一是允许更快地调试问题。 它有助于开发者, 当某些错误的事情发生时, 可能导致您网页的沉默和奇怪行为时, 将例外丢弃给开发者 。 我们使用的时间 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'
};
几乎没有更多的人,但我需要获得更多这方面的知识。