最近,我通过Crockford的jslint 输入了一些我的笔记本代码, 它犯了以下错误:

第1行字符1:缺少“严格使用”的语句。

某些搜索, 我意识到有些人在他们的 javascript 代码中添加了“ 严格使用 ” ; 。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并没有揭示此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读该语句有关, 但我不知道效果会是什么 。

那么,什么是“严格使用”;什么是“严格使用”;一切,它意味着什么,它是否仍然相关?

当前的任何浏览器是否响应“ 严格使用 ” ; 字符串, 或是否未来使用 ?


当前回答

如果人们担心使用严格使用,

浏览器中的 5 个“ 限制模式” 支持 。 这是什么意思 ? novogeek. com - krishna 的 Webb 。

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

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.
*/

其他回答

严格使用是让你的代码更安全的一种方法, 因为您不能使用危险特性, 这些特性不能像你预期的那样工作。 正如以前所写的那样, 它使代码更加严格。

John Revig写了个好摘要 写了个好摘要

这只是一个字符串,你放 在你的 javacript 文件( 在文件顶部或函数内部) 中, 看起来像这个 :

"use strict";

输入您的代码不应该对当前浏览器造成任何问题, 因为它只是一条字符串。 它可能会在未来对您的代码造成问题, 如果您的代码违反了 pragma 。 例如, 如果您目前拥有 Foo = “ bar ” 而不先定义 Foo , 您的代码将会开始失效... 在我看来这是件好事。

请注意,严格使用是在5页缩写中引入的,此后一直保留。

下面是ES6和ES7中触发严格模式的条件:

如果模块代码以含有严格使用指令的指令前言开头(见14.1.1.1)。 模块代码总是严格的模式代码。 类声明或类表达式的所有部分都是严格的模式代码。 如果以含有严格使用指令的指令前言开头,或者如果对 Eval 的调用是包含在严格模式代码中的直接 eval (见12.3.4.1) 的调用是包含在严格模式代码中的直接 eval (见12.3.4.1) , 则 Eval 代码是严格的模式代码。 如果相关代码是严格模式代码, 函数代码是严格的模式代码。

“ 严格使用 ” ; 是程序员不会使用松散或刺绣的坏性能的保险。 它是一种指南, 就像标尺会帮助您做直线。 “ 严格使用” 有助于您做“ 直线编码 ” 。

那些不愿使用统治者直线行事的人 通常最终会出现在那些网页上 要求其他人调试他们的代码

杜格·克罗克福德(Doug Crockford)曾是一位高级刺绣开发商, 多年来一直担任高级刺绣开发商, 他在这里有一个非常有趣的职位。

现代刺绣作业应总是引出“严格使用”的“严格使用”; 柔和。 ecma组之所以选择“严格”模式的唯一原因是允许经验较少的编码员使用刺绣,然后给予时间适应新的、更安全的编码作业。

语句“ 严格使用 ” ; 指示浏览器使用严格模式, 即一个缩写和安全的 Javastrict 特征集 。

特征列表列表(并非详尽无遗)

不允许的全变量 。 (在变量名称中缺少 var 声明和打字符) 静态失效分配将会在严格模式下丢出错误( 指派 nan = 5 ;) 试图删除非可删除属性将会丢弃( 删除对象 . prototype) , 要求对象字典中的所有属性名称都是独特的( var x = {x1: 1, x1: 1, x1: 2}) 函数参数名称必须是独一无二的( 函数和( x, x) {...}) 禁止八语法( var x = 023; 一些 deds 错误地假定前的零 doe

[参考:严格模式,mozilla 开发者网络]


实例:

严格模式代码不能用别名来描述在其中创建的参数对象的属性

function show( msg ){
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );

// In strict mode arguments[i] does not track the value of 
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
    "use strict";
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );