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

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

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

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

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


当前回答

严格使用用于显示常见和重复错误, 以便以不同的方式处理, 并改变 Java 脚本的运行方式,

  • 预防意外全球事故

  • 无重复

  • 消除用

  • 消除这种胁迫

  • 更安全电子( )

  • 不可更改的错误

您也可以阅读此文件第1条详细信息

其他回答

严格模式消除了在非限制模式下会忽略的错误,从而使javascript " 更安全 " 。

是否认为它是最佳做法之一?

是 是,它被认为是最佳做法的一部分, 与 Javascript 合作,包括严格模式。这样做的方式是在你的联署材料档案中添加以下代码行。

'use strict';

在你的代码。

这对用户代理意味着什么?

说明代码应该严格解释 向浏览器这样的用户代理指定 他们应该把代码 完全像书面的一样对待 如果代码不合理的话 就会出错

例如:考虑在.js您的文件有以下代码:

设想情景1:[无严格模

var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

设想情况2:[无严格模

city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

为何在两种情况下都打印变量名称?

不打开严格模式,用户代理商经常对问题代码进行一系列修改,以试图使问题代码变得合理。在表面上,这看似是一件好事,事实上,在严格模式之外工作使得人们有可能在不把所有细节都固定下来的情况下,用JavaScript代码湿透脚部。然而,作为一个开发者,我不想在我的代码中留下一个错误,因为我知道它可能会在晚些时候回来咬我,我还只是想写好代码。这就是严格模式有助于解决问题的地方。

设想方案3:[严格示范

'use strict';

city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.

附加提示 :要使用严格模式保持代码质量, 您不需要一次又一遍地写入, 特别是如果您有多个.js您可以在eslint规则如下:

文件名 : .eslintrc.js

module.exports = {
    env: {
        es6: true
    },
    rules : {
        strict: ['error', 'global'],
        },
    };
    

那么,什么是严格防止的呢?

  • 使用变量而不声明这将以严格的方式丢弃一个错误。 这是为了防止您在应用程序中无意中创建全局变量。 打印芝加哥的例子特别覆盖了这一点 。

  • 删除变量或函数或参数严格情况下是无的。

    "use strict";
     function x(p1, p2) {}; 
     delete x; // This will cause an error
    
  • 复制参数名称严格允许。

     "use strict";
     function x(p1, p1) {};   // This will cause an error
    
  • 不允许以 Javascript 语言保留单词字词是工具界面,让,包,包,私人,受保护,公开,静态和产出

若要列出更全面的清单, 请在此检查 MDN 文件 :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

ECMAScript 5采用了JavaScript“严格”模式。

(function() {
  "use strict";
  your code...
})();

书写"use strict";在您的 JS 文件的顶端, 打开严格的语法检查 。 它为我们执行以下任务 :

  1. 如果您试图指定给一个未声明的变量,则显示错误。

  2. 停止您覆盖关键 JS 系统库

  3. 禁止某些不安全或容易出错的语言特征

use strict也属于个别职能内的工作。use strict在你的代码。

浏览器兼容性问题 : “ 使用” 指令意在向后兼容。 不支持这些指令的浏览器将只看到一个字符串字典, 但没有进一步引用。 因此, 他们将会通过它继续前进 。

声明声明"use strict"; 指示浏览器使用严格模式,该模式是JavaScript的简化和安全功能集。

特征清单(并非详尽无遗)

  1. 丢弃全局变量 。var以变量名称填报声明和打字)

  2. 静音失灵任务会以严格的方式丢出错误( 指派)NaN = 5;)

  3. 试图删除不可迁移属性的尝试将会丢弃( ) 。delete Object.prototype)

  4. 要求对象字典中的所有属性名称都具有独一性( W)var x = {x1: "1", x1: "2"})

  5. 函数参数名称必须是独有的( V)function sum (x, x) {...})

  6. 禁止辛醇- 辛醇- 辛醇- 辛醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙醇- 乙酯var x = 023;有些德意志人错误地认为,前零位数没有改变数字。 )

  7. 禁止with关键字

  8. eval在严格模式下不引入新变量

  9. 禁止删除普通名称(delete x;)

  10. 强制禁止或指定姓名evalarguments以任何形式

  11. 严格模式不使用arguments对象的正格式参数。 (例如,在function sum (a,b) { return arguments[0] + b;}之所以有效,是因为arguments[0]a等) (......) (见见examples下一节,以了解差异)

  12. arguments.callee不支持不支持

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


实例:

  1. 严格模式代码不使用在其中创建的参数对象的别名属性
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" );

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

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

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 严格模式。 只有 ECMAScript 5 之前的旧浏览器才成为当前标准, 不支持它 。

命令周围的引号确保代码在旧浏览器中仍然有效(尽管那些在严格模式下产生语法错误的东西通常只会导致脚本在旧浏览器中发生一些难以探测的故障 ) 。