函数声明 precedence/overwriting 变量声明?吊装?为什么?
Function declarations precedence/overwriting variable declarations? Hoisting? Why?
片段 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?
我本可以只显示片段 1 来问这个问题 - 但我只是为了完整起见才显示这两个片段。我也在其中写了一些简短的评论。
我的问题是,在这两种情况下,为什么函数声明 'overwriting'/'shadowing' 或采用 'precedence'在变量声明上?有人可以解释一下这种行为吗?
我理解,由于“提升”现象,这些在最终结果方面可以说是相同的(从解释者的角度来看),但是为什么函数声明或变量声明在 Javascript 引擎 interpreted/parsed 时具有 优先级 ( 在 创造阶段)?即哪个被吊在另一个之上?我已经读到函数声明优先于变量声明 - 但是 为什么 是这种情况?
此外,请参考第一个代码片段(但这适用于两种情况),是'a'的内存location/address在行中声明的1,和第 6 行,完全一样吗?并且由于“a”在代码的两个 位置 中代表函数声明,因此“a”在其内存中的 值是多少 location/address在 创建阶段解析第 1 行和第 6 行之后?由于函数声明在变量声明之上'hoisted',那是否意味着第1行,'a'的内存地址是指向函数对象'a',在执行上下文的创建阶段结束时?
在两个代码片段中,'var a'是未定义的,所以why isn 't 'a' 在我们到达 执行 [=78= 时 undefined 的值] 阶段(它的 执行点从第 6 行开始?) Javascript 引擎 是否简单地说, “啊,如果我们允许‘var a’‘覆盖’‘function a() {…}’,它将继续未定义,因此无法使用。然而,如果我们允许“a”代表所述函数,那么至少用户可以调用该函数(甚至在其声明之前,而不会出现引用错误)。这不太可能是这种情况,但听起来 logical/ideal,也许?
那么,我的问题是:
- 函数声明覆盖或优先于变量声明的原因是什么?我们只是表面上接受它是因为它是 ECMAScript 规范的实现,还是我们可以解释这种行为?
和
- 如果可能,有人可以回答内存中发生了什么每一步都发生这种情况吗?
在过去的 8 小时里,我一直在尝试使用我的直觉(在那里我最终进入了 JavaScript 其他特性的另一个维度,但这本身就是另一个问题)但我想知道如果对此行为有简单或具体的解释或答案。
如果能帮助理解所有这些,我们将不胜感激。
My question is, in both cases, why is the function declaration ‘overwriting’/’shadowing’ or taking ‘precedence’ over the variable declaration? Can someone please explain this behaviour?
在这两个代码段中只有一个地方为变量 a
赋值,那就是函数声明。语句 var a;
表示 "I announce that a variable named a
exists"。由于函数声明负责声明它存在 并且 给它一个值,因此 var a;
语句实际上没有任何效果。
事实上,如果我们参考Java脚本规范的Section 10.5.8,我们可以看到这个var a;
的最终结果实际上是什么都不做,因为a
变量在处理 var a;
声明时已经声明。
I understand that these arguably are the same (from the perspective of the interpreter) in terms of end-result, due to the ‘hoisting’ phenomenon, but why does the function declaration or the variable declaration have precedence over the other when it’s interpreted/parsed by the Javascript engine during the creation phase?
"precedence" 这里没有任何内容。只有一个名为 a
的变量。 var a;
没有给 a
一个值,所以它对 a
的值没有影响。
Also, kindly refer to the first code snippet (but this applies to both cases), is the memory location/address of ‘a’ where it’s declared in line 1, and line 6, EXACTLY the same?
只有一个a
变量,它只取一个值,所以这个问题多半是无意义的,但粗略地说,a
变量本身只会存在于一个地方,它只会引用一个值(内存位置),这将是该函数的定义。
Since function declarations are 'hoisted' above the variable declaration, does that mean that by line 1, 'a's memory address is pointing to the function object 'a', by the end of the creation phase of the execution context?
我对创建阶段的了解不是很多,但是在这段代码的执行过程中,a
只引用一个值,正如我上面所说的。
In both code snippets, ‘var a’ is undefined, so why isn’t ‘a’ the value of undefined by the time we reach the execution phase (which has its execution point starting on line 6?)
查看我的第一个和第二个答案。
What’s the reason behind why the function declaration is overwriting or having precedence over the variable declaration? And
正如我所说,它没有采用 "precedence",但是 JavaScript 具有函数提升的原因是为了允许人们在函数的代码行之前调用函数实际定义,类似于 C# 和 Java 等其他主要语言的做法。
If possible, could someone please answer what is happening in memory when this occurs every step of the way?
Java脚本规范没有定义内存中发生的事情。它定义代码的外部行为。所以这将是一个实现细节,并且是特定于引擎的。
以下是执行代码时发生的情况的粗略一击(在两种情况下):
- 创建一个名为
a
的变量,并为其分配您在那里的那个函数的值。
- 检查是否有一个名为
a
的变量。已经有一个了,所以什么都不做。
- 执行
console.log
并将a
的值传递给它(即那个函数)
函数声明在变量提升之前被提升。
console.log(a);
var a = 42; // assignment
console.log(a);
function a(foo) { // a function named 'a'
var foo = "Hello World";
console.log(foo);
}
console.log(a);
片段 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?
我本可以只显示片段 1 来问这个问题 - 但我只是为了完整起见才显示这两个片段。我也在其中写了一些简短的评论。
我的问题是,在这两种情况下,为什么函数声明 'overwriting'/'shadowing' 或采用 'precedence'在变量声明上?有人可以解释一下这种行为吗?
我理解,由于“提升”现象,这些在最终结果方面可以说是相同的(从解释者的角度来看),但是为什么函数声明或变量声明在 Javascript 引擎 interpreted/parsed 时具有 优先级 ( 在 创造阶段)?即哪个被吊在另一个之上?我已经读到函数声明优先于变量声明 - 但是 为什么 是这种情况?
此外,请参考第一个代码片段(但这适用于两种情况),是'a'的内存location/address在行中声明的1,和第 6 行,完全一样吗?并且由于“a”在代码的两个 位置 中代表函数声明,因此“a”在其内存中的 值是多少 location/address在 创建阶段解析第 1 行和第 6 行之后?由于函数声明在变量声明之上'hoisted',那是否意味着第1行,'a'的内存地址是指向函数对象'a',在执行上下文的创建阶段结束时?
在两个代码片段中,'var a'是未定义的,所以why isn 't 'a' 在我们到达 执行 [=78= 时 undefined 的值] 阶段(它的 执行点从第 6 行开始?) Javascript 引擎 是否简单地说, “啊,如果我们允许‘var a’‘覆盖’‘function a() {…}’,它将继续未定义,因此无法使用。然而,如果我们允许“a”代表所述函数,那么至少用户可以调用该函数(甚至在其声明之前,而不会出现引用错误)。这不太可能是这种情况,但听起来 logical/ideal,也许?
那么,我的问题是:
- 函数声明覆盖或优先于变量声明的原因是什么?我们只是表面上接受它是因为它是 ECMAScript 规范的实现,还是我们可以解释这种行为?
和
- 如果可能,有人可以回答内存中发生了什么每一步都发生这种情况吗?
在过去的 8 小时里,我一直在尝试使用我的直觉(在那里我最终进入了 JavaScript 其他特性的另一个维度,但这本身就是另一个问题)但我想知道如果对此行为有简单或具体的解释或答案。
如果能帮助理解所有这些,我们将不胜感激。
My question is, in both cases, why is the function declaration ‘overwriting’/’shadowing’ or taking ‘precedence’ over the variable declaration? Can someone please explain this behaviour?
在这两个代码段中只有一个地方为变量 a
赋值,那就是函数声明。语句 var a;
表示 "I announce that a variable named a
exists"。由于函数声明负责声明它存在 并且 给它一个值,因此 var a;
语句实际上没有任何效果。
事实上,如果我们参考Java脚本规范的Section 10.5.8,我们可以看到这个var a;
的最终结果实际上是什么都不做,因为a
变量在处理 var a;
声明时已经声明。
I understand that these arguably are the same (from the perspective of the interpreter) in terms of end-result, due to the ‘hoisting’ phenomenon, but why does the function declaration or the variable declaration have precedence over the other when it’s interpreted/parsed by the Javascript engine during the creation phase?
"precedence" 这里没有任何内容。只有一个名为 a
的变量。 var a;
没有给 a
一个值,所以它对 a
的值没有影响。
Also, kindly refer to the first code snippet (but this applies to both cases), is the memory location/address of ‘a’ where it’s declared in line 1, and line 6, EXACTLY the same?
只有一个a
变量,它只取一个值,所以这个问题多半是无意义的,但粗略地说,a
变量本身只会存在于一个地方,它只会引用一个值(内存位置),这将是该函数的定义。
Since function declarations are 'hoisted' above the variable declaration, does that mean that by line 1, 'a's memory address is pointing to the function object 'a', by the end of the creation phase of the execution context?
我对创建阶段的了解不是很多,但是在这段代码的执行过程中,a
只引用一个值,正如我上面所说的。
In both code snippets, ‘var a’ is undefined, so why isn’t ‘a’ the value of undefined by the time we reach the execution phase (which has its execution point starting on line 6?)
查看我的第一个和第二个答案。
What’s the reason behind why the function declaration is overwriting or having precedence over the variable declaration? And
正如我所说,它没有采用 "precedence",但是 JavaScript 具有函数提升的原因是为了允许人们在函数的代码行之前调用函数实际定义,类似于 C# 和 Java 等其他主要语言的做法。
If possible, could someone please answer what is happening in memory when this occurs every step of the way?
Java脚本规范没有定义内存中发生的事情。它定义代码的外部行为。所以这将是一个实现细节,并且是特定于引擎的。
以下是执行代码时发生的情况的粗略一击(在两种情况下):
- 创建一个名为
a
的变量,并为其分配您在那里的那个函数的值。 - 检查是否有一个名为
a
的变量。已经有一个了,所以什么都不做。 - 执行
console.log
并将a
的值传递给它(即那个函数)
函数声明在变量提升之前被提升。
console.log(a);
var a = 42; // assignment
console.log(a);
function a(foo) { // a function named 'a'
var foo = "Hello World";
console.log(foo);
}
console.log(a);