【问题标题】:Why is "use strict" a plain string and not a JavaScript reserved keyword?为什么“use strict”是纯字符串而不是 JavaScript 保留关键字?
【发布时间】:2021-12-09 21:38:42
【问题描述】:

也就是说,为什么是'use strict'而不是use strict

我在这里没有找到这个问题的答案:What does "use strict" do in JavaScript, and what is the reasoning behind it?

我的猜测是它使这条指令向后兼容,不需要任何转译,但我找不到任何来源。

【问题讨论】:

  • 您要寻找的答案还没有出现在那个问题中?在制作'use strict' 时也不存在转译
  • 为什么它不是保留关键字。换句话说,为什么'use strict' 而不是use strict
  • 当它被引入时,重要的是您可以将它添加到 Javascript 文件中,并且该文件中的代码仍然可以在旧版浏览器中运行。
  • It's called 一个“prologue directive”。也使用例如对于"use asm;"

标签: javascript


【解决方案1】:

是的,这是为了向后兼容。一些来源:

  • https://blog.maisie.ink/js-strict-mode/

    严格模式必须是一种选择加入功能才能保持向后 与旧脚本的兼容性。一些旧脚本依赖于特性 该严格模式已弃用,因此需要在非严格模式下运行 默认模式。此外,选择加入语法 'use strict'; 只是 一个字符串文字,它允许新脚本在旧浏览器中运行。

  • https://medium.com/jp-tech/introduction-to-strict-mode-in-javascript-fb977bab697c

    [为什么不完全改变 ECMAScript 规范而不是 引入额外的“严格模式”?] 也许其中一部分是为了确保 ES5 和之前版本之间的一些向后兼容性 是 ES3,部分原因是 ECMAScript 保留了简单性和灵活性 从以前开始,而不是被新添加的严格规则限制

  • https://johnresig.com/blog/ecmascript-5-strict-mode-json-and-more/(约翰·雷西格)

    注意用于启用严格模式的语法(我喜欢这个!)。它的 只是单个语句中的一个字符串,恰好包含 内容“使用严格”。 没有引入新的语法来启用 严格模式。 这是巨大的。这意味着您可以打开严格模式 在你的脚本中——今天——它在最坏的情况下不会产生副作用 旧浏览器。

    (通过this answer找到)

更权威:

  • an email by Waldemar Hartmann 在 es5-discuss 邮件列表中(显然是 es-dicuss 的前身?),通过 those 古代会议记录找到:

    […] use strict 指令的一般概念是它通常 遵循 ECMAScript 语句的词法规则,甚至可能出现 在选择加入的语言的未来版本中未引用 语法扩展。

  • ES5 规范本身notes on the

    指令序言的 ExpressionStatement 产生式是 在包含 SourceElements 的评估期间正常评估 生产。实现可以定义实现特定的 不是 Use 的 ExpressionStatement 产生式的含义 严格指令,出现在指令序言中。

    所以它不仅向后兼容,而且向前兼容——这确实用于"use asm"; directive 以后

  • official paper by the spec authors Allen Wirfs-Brock and Brendan Eich on JavaScript详细解释推理:

    早期的一个问题是选择加入严格模式的工作方式。 […] 一 可能性是使用一种特殊形式的注释作为指令。 但是 ES3.1 工作组不愿意做 cmets, 任何形式,语义上很重要,因为 JavaScript 最小化器 删除 cmets。 Allen Wirfs-Brock 观察到 ECMAScript ExpressionStatement 生成任何表达式,包括那些 仅由文字字符串常量组成的有效语句 只要它是显式或隐式(通过 ASI)后跟一个 分号。这意味着像"use strict"; 这样的语句是 语法上有效的 ES3 代码。因为它只是一个常数值, 评估它在 ES3 中没有副作用。这是一个无操作。它出现 使用这样的语句作为严格模式的选择是非常安全的,因为它 任何现有的 JavaScript 代码似乎都不太可能已经 已经使用了该确切的语句形式,并且 ES3 实现将 忽略它在任何加载的 ES5 代码中的存在。工作组 采纳了这个想法。出现"use strict"; 形式的声明 作为脚本或函数体的第一条语句表明 应使用严格模式处理整个脚本或函数 语义。

【讨论】:

  • 我不确定松散模式是否有保留关键字? (你没这么说,顺便说一句)
  • @evolutionxbox ES3 确实有保留字(关键字),只是没有未来的。
【解决方案2】:

为了向后兼容。
不支持严格模式的浏览器将直接忽略该字符串。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2022-11-21
    • 2010-10-08
    • 2011-11-02
    • 2015-11-06
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多