最近,我通过克罗福德 查了一些JavaScript代码JSLint JSLint,并给出了以下错误:

第1行第1字符1:缺少“严格使用”声明的问题。

在做一些搜索时,我意识到有些人加了"use strict";输入 JavaScript 代码。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并未披露此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读 JavaScript 有关, 但我不知道效果会是什么 。

那么,什么是"use strict";关于它的意义是什么,它是否仍然相关?

当前浏览器中的任意浏览器响应"use strict";字符串, 还是用于未来用途 ?


当前回答

"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 上更多读取.

其他回答

严格模式可以防止内存泄漏。

请检查以下以非限制模式写入的函数 :

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

在此函数中, 我们正在使用一个变量, 名为name函数 内 函数 。 内部 汇编器将首先检查在该特定函数范围中是否有以该特定名称宣布的变量。 由于编辑器了解不存在该变量, 它将在外部范围中检查。 在我们的案例中, 它就是全球范围 。 同样的, 汇编器理解全球空间中也没有以该名称宣布的变量, 因此它会在全球空间中为我们创建这样一个变量。 从概念上讲, 该变量将创建在全球范围内, 并将在整个应用程序中提供 。

另一个假想是,比如,变量在子函数中被声明为子函数。 在这种情况下, 编译者检查该变量在外部范围的有效性, 即父函数。 只有这样, 它才能在全球空间中检查并创建变量。 这意味着需要做更多的检查。 这将影响应用程序的性能 。


现在让我们在严格模式下写入相同的函数 。

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

我们会得到以下错误。

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

在此, 编译器会丢弃引用错误。 在严格模式下, 编译器不允许我们使用变量而不声明它。 这样可以防止内存泄漏。 此外, 我们可以写入更优化的代码 。

通常JavaScript通常不遵循严格的规则,从而增加出错的可能性。"use strict", JavaScript 代码应该像使用终止语、在启动前宣布等其它编程语言一样,遵循一套严格的规则。

如果(如果)"use strict"使用该代码时,代码的编写应遵循一套严格的规则,从而减少出错和模棱两可的可能性。

严格模式对普通 JavaScript 语义进行若干修改 :

  • 将一些 JavaScript 沉默错误修改为丢弃错误,从而消除这些错误 。

  • 修正错误, 使 JavaScript 引擎难以执行优化 。

  • ECMAScript禁止今后版本的ECMAScript可能界定的某种语法。

用于获取更多信息严格模式 Javascript

添加时添加"use strict";中,下列情况将投语法错误在脚本执行之前:

  • 为未来的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} 
    

    ECMACcript 6 (ECMAScript 6)已不再属于这种情况(ECOMACcript 6) (EECMAScript 6) (EECMACcript 6) (EECMACcript 6) (EECMACcript 6)) 。昆虫 1041128).

  • 以相同名称函数宣告两个函数参数

    f(a, b, b){}
    
  • 设定未声明变量的值

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • 使用delete在变量名称上delete myVariable;

  • 使用evalarguments作为变量或函数参数名称

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

资料来源:

如果人们担心使用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.
*/