【问题标题】:Is 'use strict' implied when ES modules is used?使用 ES 模块时是否暗示“使用严格”?
【发布时间】:2020-03-05 10:08:47
【问题描述】:

我在学习 JS 时遇到了“use strict”。然后,这里Should I 'use strict' for every single javascript function I write?@Bergi 说“你只应该在模块范围内放置'use strict' - 每个文件一次 - 以便它被你的所有函数继承”。 “它被所有函数继承”是否意味着某个模块中的每个函数在其自身内部都使用“use strict”?

【问题讨论】:

  • 任何type="module" 脚本都会自动处于严格模式,是的。
  • @ASDFGerte,例如,如果我们有像 function Addition(){'use strict'} 这样的函数,那么 es 模块中的每个函数本身都有 use strict。对吗?
  • 如果您使用的是原生 JavaScript 模块,那么默认情况下,您的模块中的所有代码将处于严格模式。如果您使用的是较旧的手动模块化模式,则需要在模块顶部声明 'use strict'

标签: javascript


【解决方案1】:

“它被所有函数继承”是否意味着某个模块中的每个函数在其自身内部都使用“use strict”?

如果满足以下条件,函数将以严格模式运行:

(1) 函数在 ES6 模块中(这些都在严格模式下运行),或者

(2) 函数定义上方有一个适当的'use strict' 指令,词法上

除了一些不太常见的实例,例如在constructor 内。

'use strict' 在词法上的继承方式与引用变量的方式相同,以及变量范围的工作方式 - 如果函数的任何外部块是严格的,那么内部函数也是严格的。因此,例如,使用以下代码:

'use strict';
function foo() {
  function bar() {
    function baz() {
    }
  }
}

无论您在foobarbaz 中添加了哪些其他代码,所有这些函数,无论它们如何运行,都将在严格模式下运行。如果从在严格模式下运行的源调用这些函数之一,则被调用的函数仍将在严格模式下运行。例如:

<script>
'use strict';
function foo() {
  return function bar() {
    return function baz() {
      console.log('baz running. strict:', this === undefined);
    }
  }
}
foo()()();
</script>
<script>
// Non-strict script calling strict function:
foo()()();
</script>

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2011-12-21
    • 2011-09-19
    • 2014-07-02
    • 2017-03-17
    • 2011-09-12
    相关资源
    最近更新 更多