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

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

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

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

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


当前回答

由于浏览器的战争和不良的管理,手稿的设计和实施过于仓促。 结果导致许多设计决定不善,不直观的语法和混淆不清的语义进入了语言。 严格的方式旨在修正其中的一些错误。

“使用严格”指令在向程序员传达代码的同时, 也设定了对代码的替代解释。

例如,此关键字指方法定义中的对象,如此,或指其他语言的自定义。

let o = {
  name: 'John Doe',
  sayName: function(){
    console.log(this.name);
  }
};

o.sayName(); // 'John Doe'

这在方法上下文之外没有任何目的,但所有javascript函数都有这个关键词,无论它们是否为方法:

function run() {
  console.log(this);
}

run(); // Window

在这里,这是对一个全球目标的确定,它没有意义,也没有意义,因为全球目标已经在范围中存在。

在一个全球功能中,严格地以这种方式,决心作出不确定的决定,这正是我们所期望的。

"use strict"

function run() {
  console.log(this);
}

run(); // undefined

有些错误即使严格的方式也无法固定, 因为语法应该对旧浏览器有效, 因为它们忽略了“ 限制模式” 指令。 这是故意的 。

其他回答

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

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

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

在此函数中, 我们正在使用函数中的变量 。 内部, 编译者将首先检查该函数范围中是否有以该特定名称宣布的变量。 由于编译者了解不存在此变量, 它将在外部范围中检查。 在我们的情况中, 它就是全球范围。 汇编者再次理解全球空间中也没有以该名称宣布的变量, 因此在 Glob 中为我们创建了这样一个变量

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


现在让我们以严格的方式写出相同的函数。

"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

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

“严格”模式引入了5号标本中。

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

刻写“ 严格使用 ” ; 在您 js 文件的顶部打开严格的语法检查 。 它为我们执行以下任务 :

如果您试图指定给一个未声明变量, 则显示错误 。 如果您试图指定给一个未声明的变量, 则会阻止您覆盖密钥 js 系统库禁止某些不安全或易出错的语言功能。

个人功能内部的工程也严格使用。在代码中加入严格使用总是更好的做法。

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

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

是否将它视为最佳做法之一?

是的,它被视为最佳做法的一部分,同时与 Javascript 合作, 包括严格的方式。 这是通过在您的 js 文件中添加下面的代码行来完成的 。

“严格使用”;

在你的代码。

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

表示代码应严格解释,向浏览器等用户代理器指定代码应如实处理代码,如果代码不合理,则会出错。

例如:在您的 .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

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

用户代理商经常对问题代码进行一系列的修改, 试图让问题代码变得合理。在表面上,这看起来就像一件好事, 事实上,在严格模式之外工作, 使得人们有可能在不把所有细节都固定下来的情况下, 将脚部浸湿在刺写代码中。 但是,作为一个开发者,我不想在我的代码中留下一个错误, 因为我知道它可能会回来咬我,

情景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'],
        },
    };
    

好吧,那么什么是被阻止 严格的方式?

使用变量而不声明会以严格模式丢弃错误 。 这是为了防止您在应用程序中无意中生成一个错误 。 打印 Chicago 的例子特别包含此内容 。 删除一个变量或函数或参数或参数是严格模式的不拒绝 。 “ 严格使用 ” ; 函数 x( p1, p2) {} {} {} ; 删除 x ; / / 这将导致错误, 严格模式不允许重复参数名称 。 “ 严格使用 ” ; 函数 x (p1, p1) {} {} {} / 这将造成错误, 严格模式不允许重复参数名称 。 “ 严格使用 ” ; 函数 x (p1, p1) {} {} / 这将 cau 。

此处的 mdn 文件请查阅更全面的清单: https:// developmenter.mozilla.org/en-us/docs/web/javascript/reference/strict_mode。

在使用“严格使用”之后,“严格使用”代码应该像使用终止语、启动前声明等其他节目语言一样,遵循一套严格的规则。

如果使用“严格使用”,守则的编写应遵循一套严格的规则,从而减少错误和模棱两可的可能性。

使用“ 严格使用 ” ; 不要突然使您的代码变得更好 。

缩略图5 中有一个特性,即严格模式。 您可以在脚本/ 函数顶部声明此功能, 从而启用严格模式 。

'use strict';

当 Javascript 引擎看到此指令时, 它将开始以特殊模式解释代码。 在此模式下, 当某些代码操作最终被检测到可能导致错误( 这是严格模式背后的推理 ) 时, 错误就会出现 。

考虑一下这个例子:

var a = 365;
var b = 030;

开发者执着于排列数字字数, 无意中初始化了变量b, 带有八字数。 非限制模式会将此解读为数值 24 的数值字数( 在基数 10 中) 。 然而, 严格模式会丢弃错误 。

关于严格模式的非穷尽性专业清单,请见此答复。


我应在哪里使用“严格使用”;

在我的新 Javascript 应用程序中: 绝对严格的模式可以用来作为检举人, 当您对您的代码做一些蠢事时。 在我现有的 javascript 代码中: 如果您现有的 javascript 代码有严格模式中被禁止的语句, 应用可能只是中断 。 如果您想要严格模式, 您应该准备调试并纠正您现有的代码 。 这就是为什么使用“ 严格 ” ; 不要突然使您的代码变得更好 。


我如何使用严格的模式?

在您的脚本上方插入“ 严格使用 ” ; 语句 : // 文件: 笔记本. js “ 严格使用 ” ; var a = 2;... 注意文件中的所有文字都将严格解释我的文稿。 js 。 或者, 插入“ 严格使用 ” ; 在您函数体上方插入语句: 函数 Dohine () { “ 严格使用 ” ; ......} 函数词汇范围内的事物将严格解释。 这里必须使用词汇范围。 例如, 如果您严格的代码要求 func 的话, 则此词词很重要 。


严格禁止什么?

(请注意,这不是一个详尽无遗的清单):

从历史上看, javascript 一直被混淆了如何界定函数的范围。 有时,这些功能似乎被静态地界定范围, 但有些特征使得它们表现得好像它们被动态地界定范围。 这是令人困惑的, 使程序难以阅读和理解。 误解引起错误。 这也是一个绩效问题。 静态范围界定将允许在汇编时发生可变的有约束力的情况, 但动态范围的要求意味着约束必须推迟到运行时间, 而这又来了


预留的单词,用于未来的 Javacramp 版本

缩略图 5 添加了一个保留单词列表。 如果您使用它们作为变量或参数, 严格的模式会丢出错误。 保留单词是:

安装、接口、让、包装、私营、受保护、公共、静态和产出


进一步读

严格模式 - javascript + @ mdn 浏览器支持严格模式向严格模式过渡