JavaScript:函数可以引用下面声明的另一个函数吗?

JavaScript:函数可以引用下面声明的另一个函数吗?,javascript,function,scope,hoisting,lexical,Javascript,Function,Scope,Hoisting,Lexical,我有: 我认为JavaScript变量被提升到顶部,但不是它们所分配的值。不知何故,multiply调用add不会返回错误,即使add是在multiply下面声明的,声明被提升到顶部,而赋值则不是 但是,函数在创建时不会将任何变量的值保留在它们之外。取而代之的是,当他们被召唤时,他们会使用其中的任何东西。在这种情况下,add在创建multiply函数时是undefined,但在调用multiply之前分配了一个函数,因此multiply使用新分配的函数 为了更清楚地看到这一点,请考虑此代码:

我有:


我认为JavaScript变量被提升到顶部,但不是它们所分配的值。不知何故,
multiply
调用
add
不会返回错误,即使
add
是在
multiply
下面声明的,声明被提升到顶部,而赋值则不是

但是,函数在创建时不会将任何变量的值保留在它们之外。取而代之的是,当他们被召唤时,他们会使用其中的任何东西。在这种情况下,
add
在创建
multiply
函数时是
undefined
,但在调用
multiply
之前分配了一个函数,因此
multiply
使用新分配的函数

为了更清楚地看到这一点,请考虑此代码:

var multiply=函数(num){
返回加(个)*2;
};
//这将是一个错误
//控制台日志(乘法(1));
var add=函数(num){
返回num+1;
};
console.log(乘法(1));//印刷品4
添加=函数(num){
返回num+2;
};

console.log(乘法(1));//Prints 6
我想是的,基于我读这篇文章时公认的有缺陷的记忆,这可能会教给你比你想知道的更多的东西。我记得的基本知识包括,每个函数都有自己的执行上下文,其中包括两个内部词法环境(其中一个特定于使用
var
声明的标识符),这些词法环境可以访问外部环境。另外,我认为
var
function
声明被挂起,但是
const
声明被挂起……解释非常简单。JS允许函数引用不存在的变量。因此,只有在调用函数之后才可能出现错误。在调用时,如果引用的变量不存在,则会出现错误。作为测试,删除
add()
函数,并更新
multiply()
,以便它使用
try/catch
,其中
try
尝试调用
add()
,而
catch
window.add=function(){…}
处创建它。您将看到ReferenceError在第一次调用时被捕获,但随后的调用会成功…如下所示:
// Shouldn't we have the following hoisted?
// var multiply; (undefined)
// var add; (undefined)

var multiply = function(num) {
  return add(num) * 2;
};

var add = function(num) {
  return num + 1;
};

console.log(multiply(1)); // No error, somehow "multiply" calls "add"!