gil*_*ran 37 javascript hoisting ecmascript-6 es6-modules
我知道在新的ES6模块语法中,JavaScript引擎不必评估代码以了解所有导入/导出,它只会解析它并"知道"要加载的内容.
这听起来像是在吊装.ES6模块是否悬挂?如果是这样,它们会在运行代码之前加载吗?
这段代码可以吗?
import myFunc1 from 'externalModule1';
myFunc2();
if (Math.random()>0.5) {
import myFunc2 from 'externalModule2';
}
Run Code Online (Sandbox Code Playgroud)
ale*_*ods 25
它将是一个SyntaxError.根据规范的这一部分:
Module :
ModuleBody
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
StatementListItem
Run Code Online (Sandbox Code Playgroud)
这意味着模块只能包含ImportDeclaration's ExportDeclaration'或StatementListItem's'.根据这个 StatementListItem不能包含ImportDeclaration也没有ExportDeclaration.
import myFunc1 from 'externalModule1';
Run Code Online (Sandbox Code Playgroud)
是进口申报,而:
if (Math.random()>0.5) {
import myFunc2 from 'externalModule2';
}
Run Code Online (Sandbox Code Playgroud)
是一份声明.所以你的代码会导致语法错误.
那么"在运行代码之前它们都会被加载吗?".规范的这一部分包含下一句:
注意:在实例化模块之前,它所请求的所有模块都必须可用.
是的.在运行代码之前,它们都将被加载.
gil*_*ran 25
在做了一些研究后,我发现:
此代码没有错误,并且将起作用:
localFunc();
import {myFunc1} from 'mymodule';
function localFunc() { // localFunc is hoisted
myFunc1();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14442 次 |
| 最近记录: |