最近,我通过克罗福德 查了一些JavaScript代码JSLint JSLint,并给出了以下错误:
第1行第1字符1:缺少“严格使用”声明的问题。
在做一些搜索时,我意识到有些人加了"use strict";
输入 JavaScript 代码。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并未披露此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读 JavaScript 有关, 但我不知道效果会是什么 。
那么,什么是"use strict";
关于它的意义是什么,它是否仍然相关?
当前浏览器中的任意浏览器响应"use strict";
字符串, 还是用于未来用途 ?
ECMAScript 5采用了JavaScript“严格”模式。
(function() {
"use strict";
your code...
})();
书写"use strict";
在您的 JS 文件的顶端, 打开严格的语法检查 。 它为我们执行以下任务 :
如果您试图指定给一个未声明的变量,则显示错误。
停止您覆盖关键 JS 系统库
禁止某些不安全或容易出错的语言特征
use strict
也属于个别职能内的工作。use strict
在你的代码。
浏览器兼容性问题 : “ 使用” 指令意在向后兼容。 不支持这些指令的浏览器将只看到一个字符串字典, 但没有进一步引用。 因此, 他们将会通过它继续前进 。
如果人们担心使用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.
*/
我想提出一个更有根据的答案来补充其他答案。 我希望编辑最受欢迎的答案,但失败了。 我试图尽可能全面和完整地完成它。
您可以引用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
当你试着读的时候