如果某些情况下没有异步操作, JavaScript 是否可以执行第 n+1 行代码而无需等待第 n 行?

Can JavaScript perform nth+1 line of code without waiting nth line if there no async operations in some cases?

经过 5 年的 JavaScript 经验

我对此产生了怀疑

这种情况太罕见了:我需要通过 Webpack(来源:TypeScript)为...构建一些 JavaScript PUG 预处理器!我的库(MixinArgumentValidator)写的太复杂了JavaScript,也用了一些库。在下面的项目结构中,OutputFileGenerator.ts 生成 MixinArgumentsValidator.pug.

MixinArgumentsValidator.pug 仅包含 - 符号(在 Pug 中,这意味着原始 JavaScript 必须在预处理期间执行)和来自 [=19= 的缩小 JavaScript 代码]:

从理论上讲,如果要在其他pug文件中包含MixinArgumentsValidator.pug,全局变量MixinArgumentsValidator必须可用。是这样,但是......来自第二次哈巴狗汇编。

实验

我在我的项目中只留下了 2 个 pug 文件(入口点)。此外,我将以下控制台日志添加到 MixinArgumentsValidator.pug:

在第一遍中,MixinArgumentsValidator未定义,但在第二遍中可用:

我在编译代码中没有发现任何超时、间隔或承诺。 MixinArgumentsValidator 执行是完全同步的:

如果你想检查异步元素的 Webpack 代码,我添加了 link 到 MixinArgumentsValidator.jsbeautified version

Webpack 设置

在上面的实验中,webpack的output设置为:

output: {
  path: __dirname,
  filename: "[name].js",
  libraryTarget: "umd"
}

我也试过:

output: {
  path: __dirname,
  filename: "[name].js",
  libraryTarget: "umd",
  library: "MixinArgumentsValidator"
}

对于此设置,MixinArgumentsValidator 是对象,不是函数,但它在第二遍中也是可见的。

感谢阅读这些问题。

帕格的最高等级this

我的库从第一遍开始就存在于哈巴狗的顶级上下文中,从第二遍开始,顶级上下文几乎没有改变(只是从第二遍添加了 input_char: '>')。

Object [global] {
  global: [Circular],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] { [Symbol(util.promisify.custom)]: [Function] },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(util.promisify.custom)]: [Function]
  },
  '__core-js_shared__': {
    versions: [ [Object] ],
    wks: {
      toStringTag: Symbol(Symbol.toStringTag),
      _hidden: Symbol(Symbol._hidden),
      toPrimitive: Symbol(Symbol.toPrimitive),
      hasInstance: Symbol(Symbol.hasInstance),
      isConcatSpreadable: Symbol(Symbol.isConcatSpreadable),
      iterator: Symbol(Symbol.iterator),
      match: Symbol(Symbol.match),
      replace: Symbol(Symbol.replace),
      search: Symbol(Symbol.search),
      species: Symbol(Symbol.species),
      split: Symbol(Symbol.split),
      unscopables: Symbol(Symbol.unscopables),
      asyncIterator: Symbol(Symbol.asyncIterator),
      observable: Symbol(Symbol.observable)
    },
    keys: { IE_PROTO: 'Symbol(IE_PROTO)_2.wy4w0dx9di' },
    'symbol-registry': {},
    symbols: {},
    'op-symbols': {}
  },
  indent_handlebars: false,
  MixinArgumentsValidator: Object [Module] {
    MixinArgumentsValidator: [Getter],
    ObjectDataValidatorTypes: [Getter]
  },
  input_char: '>'
}

仍然不知道原因,但获得预期效果的最安全方法是:

  1. 封装进口以减少全球space污染:
output: {
 path: __dirname,
 filename: "[name].js",
 libraryTarget: "umd",
 library: "MixinArgumentsValidatorExports"
}
  1. 因为从第一遍开始就存在全局 space 导出,所以可以提取它们:
include HikariPug-Kernel/MixinArgumentsValidator/MixinArgumentsValidator

-
  const MixinArgumentsValidator = this.MixinArgumentsValidatorExports.MixinArgumentsValidator;
  const ObjectDataValidatorTypes = this.MixinArgumentsValidatorExports.ObjectDataValidatorTypes;

或更短:

  const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this.MixinArgumentsValidatorExports;

如果没有 library: "MixinArgumentsValidatorExports" 编译怎么办?

使用变得更容易,但全球space污染会增加。

const { MixinArgumentsValidator, ObjectDataValidatorTypes } = this;