ste*_*ger 5 import export constants ecmascript-6 es6-modules
我尝试寻找有关此确切场景的解释,但找不到任何内容。我有一个如下所示的模块(简化版):
export default function(name) {
return map[name];
}
const map = {
'a': 'b',
'b': 'c'
};
Run Code Online (Sandbox Code Playgroud)
显然,上面的 const 定义已被提升,但在函数中使用时应该是未定义的。我试图找到一个确切的解释来解释为什么这个函数在导入和使用时有效。难道不应该抛出引用错误吗?我唯一能想到的是整个模块是在调用此函数之前加载的,但是这种情况到底是如何发生的或者在哪里解释了这个特定行为?任何信息将不胜感激。
JS 使用词法作用域,这意味着作用域被定义为代码嵌套结构的一部分。任何在该范围内任何地方引用变量名称的内容都可以尝试访问该值。实际值是什么取决于该值何时初始化,这是代码的运行时属性。
当人们在 JS 中谈论时,hoisting通常并不清楚他们所描述的是哪些东西。在 JS 中,由于作用域是基于词法的,因此给定变量的存在性会被提升,因为它始终存在于该作用域内。
作用域中变量的实际初始化取决于变量的声明方式。
function foo(){}声明的初始化被提升,因此变量foo在函数体中始终可用,即使声明稍后出现。例如
foo();
function foo(){}
Run Code Online (Sandbox Code Playgroud)
是完全有效的。
var foo = 4;提升初始化,但值被初始化为undefined直到声明执行,例如
foo; // undefined
var foo = 4;
foo; // 4
Run Code Online (Sandbox Code Playgroud)let/const仅在执行时才进行初始化,尝试访问未初始化的变量会抛出异常。
foo; // would throw because it is not initialized yet
let foo = 4;
foo; // 4
Run Code Online (Sandbox Code Playgroud)因此,将它们放在一起,变量的行为仅在运行时确定。对于您的代码示例,这取决于函数被调用的时间。由于let foo = 4;仅在运行时初始化foo,因此如果先调用该函数,则会失败,而如果在之后调用该函数,则它将起作用。
function log(){
console.log(foo);
}
log(); // would throw because foo has not been initialized
let foo = 4;
log(); // would log 4
Run Code Online (Sandbox Code Playgroud)
这种延迟初始化的行为let通常const被称为“暂时死区”。
归根结底,只要变量已初始化并且在访问它时具有您关心的值,您的代码就可以了。您是否有权首先访问该变量仅取决于代码的嵌套。
只有在执行您提供的整个模块之后才能进行调用(在此模块之外)(这意味着在调用函数时映射已经初始化)
这一观察基于这样一个事实:当您导入模块时,其中的所有代码都将被执行。要调用该函数,必须导入您提供的模块。
请参阅ES6 模块导入是否执行导入文件内的代码?导入时执行代码的时间。
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |