【发布时间】:2018-02-11 09:54:06
【问题描述】:
片段 1:
var a; // undefined variable named 'a'
function a(foo) { // a function named 'a'
var foo = "Hello World";
console.log(foo);
}
console.log(a); // output is: [Function: a], but why not undefined?
片段 2:
function a(foo) { // a function named 'a'
var foo = "Hello World";
console.log(foo);
}
var a; // undefined variable named 'a'
console.log(a); // output is: [Function: a], but why not undefined?
我本可以只展示 Snippet 1 来提出这个问题 - 但是我展示这两个只是为了完整性。我也在其中写了一些简短的 cmets。
我的问题是,在这两种情况下,为什么函数声明是“overwriting”/'shadowing' 或在变量声明上采用“precedence”?有人可以解释一下这种行为吗?
我知道,由于“提升”现象,这些在最终结果方面可以说是相同的(从解释器的角度来看),但是 为什么 函数声明或变量声明在被 Javascript 引擎解释/解析时(在 创建 阶段)具有优先权?即哪一个被提升到另一个之上?我读过它是函数声明优先于变量声明 - 但是为什么会出现这种情况?
另外,请参考第一个代码 sn-p(但这适用于两种情况),是在第 1 行和第 6 行声明的“a”的内存位置/地址 , 完全相同的?由于“a”在代码的两个位置都表示函数声明,在解析第 1 行和第 6 行后,“a”在其内存位置/地址处的 值是多少在创作阶段?由于函数声明被“提升”在变量声明之上,这是否意味着在第 1 行中,在 创建结束时,'a 的内存地址指向函数对象'a' 执行上下文的阶段?
在两个代码 sn-ps 中,'var a' 是未定义的,所以 why isn't 'a' 在我们到达 执行 阶段时 undefined 的值(它的 执行点从第 6 行开始? ) Javascript 引擎 是否简单地说,“啊,如果我们允许 'var a' '覆盖' 'function a() {...}',它将继续未定义并且因而无法使用。然而,如果我们允许 'a' 表示所述函数,那么至少用户可以调用所述函数(甚至在其声明之前,不会出现引用错误)“。这种情况不太可能发生,但听起来合乎逻辑/理想,也许吧?
所以,我的问题是:
- 函数声明覆盖或优先于变量声明的原因是什么?是因为它是 ECMAScript 规范的实现而我们只是接受表面上的东西,还是我们可以解释这种行为?
和
- 如果可能,当这种情况发生在每一步时,有人可以回答记忆中发生了什么吗?
在过去的 8 个小时里,我一直在尝试使用我的直觉(在那里我最终陷入了 JavaScript 其他特性的另一个维度,但这本身就是另一个问题)但我想知道是否有一个简单的或对此行为的具体解释或答案。
任何有助于理解所有这些的帮助将不胜感激。
【问题讨论】:
-
你在做一组家庭作业吗,因为这个问题是very similar to your other question posted not so long ago。
-
我想我以前从未见过这样的家庭作业问题。我最初计划在这些线程中问这个问题,但它们最终会太长。它是相关的,但与那个问题无关,因此这个单独的线程。任何合并都会混淆并影响对我的查询的完全理解。无论如何,重点不仅是帮助自己,还要帮助将来可能有类似问题的其他人......幸运的是,我还没有找到类似的问题 - 你可以吗?
-
"在两个代码 sn-ps 中,'var a' 是未定义的" - 呃,不是吗?
-
@Bergi 我不想在 sn-p 的 cmets 中写太多。我的意思是,如果 'var a' 在其 OWN 上(并且没有函数 'a'),在执行阶段发生之前,var 将是未定义的,对吗?因为它没有价值……
-
是的,如果没有函数声明,
a的值将是undefined
标签: javascript memory functional-programming variable-declaration function-declaration