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

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

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

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

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


当前回答

我的两分钱:

严格模式的目标之一是允许更快地调试问题。 它有助于开发者, 当某些错误的事情发生时, 可能导致您网页的沉默和奇怪行为时, 将例外丢弃给开发者 。 我们使用的时间 use strict,代码将排除错误,帮助开发者提前修正错误。

使用后我学到的几件重要东西 use strict :

防止全球变量宣言:

"use strict";
var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

现在,这个代码创造了nameoftree全球范围,可使用window.nameoftree.当我们执行use strict代码会丢出错误 。

未标记引用错误: 未定义树名

消除 " 消除 "with语句:

with无法使用工具例如微克- js。它们也是折旧从未来的 JavaScript 版本中删除 。

样本 :

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000
};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
   // nameoftree = typeOfTree.name;

    for (var i = 0; i < 2; ++i) {
       // let(leafCount = i) { /*do something*/ }
    }
    for (var i = 0; i < 2; ++i) {
        with(leafCount = i) { /*do something*/ }
    }
};

var tree1 = new Tree(tree1Data);
console.log(window);

防止重复:

当我们有重复财产时,它会提出一个例外

未标记的语法错误: 严格方式不允许以对象文字复制数据属性

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

几乎没有更多的人,但我需要获得更多这方面的知识。

其他回答

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

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

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

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

在ECMAScript委员会里 有一些人说得很好:对 JavaScript, 第一部分 1: ECMAScript 5 的修改”关于逐步增加使用《公约》和《京都议定书》"use strict"允许 JavaScript 执行者清理 JavaScript 的许多危险特性,

当然,它也谈到很多这些错误的特征是什么,以及ECMAScript 5是如何修补这些错误的。

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

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

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

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

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

声明声明"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" );

提醒大家小心,你们所有硬收费程序设计员:"use strict"现有的代码可能危险! 这东西不是某种感觉良好、 快乐的贴纸, 你可以用它来“ 更好 ” 。"use strict"pragma, 浏览器会突然在它以前从未丢弃的随机地点出现Thalrow例外, 仅仅因为在那个地点你正在做一些 默认的/失败的 JavaScript 乐于允许但严格的 JavaScript 憎恶的东西! 您可能会在代码中很少使用的电话中隐藏严格违反规则的情况, 这些电话只有在他们最终逃跑时才会扔出例外 - 比如, 在您的付费客户所使用的生产环境中!

如果你要跳下去, 申请是一个很好的主意"use strict"与综合单元测试和严格配置的 JSHint 构建任务同时进行综合单元测试和严格配置的 JSHint 构建任务, 这将使你有信心你的模块没有黑暗的角落, 仅仅因为你打开了严格模式, 就会可怕地爆炸。 或者, 嘿, 这里还有一个选项: 不要添加"use strict"对你的任何遗产代码, 它可能更安全 这样,诚实地说。绝对不做添加 添加"use strict"用于您没有拥有或维持的模块,如第三方模块。

我想,即使它是一个致命的笼子动物,"use strict"可以是好东西, 但你必须做对。 最好严格的时候是您的项目是绿地, 而您是从零开始的。 配置JSHint/JSLint和所有警告和选择 调出所有的所有警告和选择 调得越紧,你的团队可以 胃,得到一个良好的建设/测试/资产系统Grunt+Karma+Chai,并且只有当时N才会开始将您所有的新模块标记为"use strict"准备纠正大量乳臭错误和警告。确保每个人都了解重力,将建筑配置为FAIL,如果JSHint/JSLint产生任何违反行为。

当我通过我的项目时,我的项目不是一个绿地项目"use strict"结果,我的IDE 满是红标记 因为我没有"use strict"我一半的模块,JSHint抱怨这一点。这提醒我,我将来应该做什么。我的目标是,因为我失踪了,所以没有红色标记。"use strict"声明,但这已经是多年之后的事了。