如果某些情况下没有异步操作, 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.js
的 beautified 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: '>'
}
仍然不知道原因,但获得预期效果的最安全方法是:
- 封装进口以减少全球space污染:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidatorExports"
}
- 因为从第一遍开始就存在全局 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;
经过 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.js
的 beautified 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: '>'
}
仍然不知道原因,但获得预期效果的最安全方法是:
- 封装进口以减少全球space污染:
output: {
path: __dirname,
filename: "[name].js",
libraryTarget: "umd",
library: "MixinArgumentsValidatorExports"
}
- 因为从第一遍开始就存在全局 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;