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"!