javascript可以在调用方之后定义被调用方,它是如何被解析的?

javascript可以在调用方之后定义被调用方,它是如何被解析的?,javascript,Javascript,我想知道javascript如何做到这一点?可以在调用方调用函数后定义该函数 是否有任何文件详细说明其工作原理 谢谢这叫“吊装”。这篇文章很好地解释了这一点: 基本上,第一个代码段被视为第二个: a(); function a(){}; 变成 var a = function a(){}; a(); 这是因为函数声明。所有函数声明都被提升到包含范围的顶部。函数声明如下所示: function functionName(arg1, arg2){ ..code here } 这就是为什

我想知道javascript如何做到这一点?可以在调用方调用函数后定义该函数

是否有任何文件详细说明其工作原理


谢谢

这叫“吊装”。这篇文章很好地解释了这一点:

基本上,第一个代码段被视为第二个:

a();
function a(){};
变成

var a = function a(){};
a();

这是因为函数声明。所有函数声明都被提升到包含范围的顶部。函数声明如下所示:

function functionName(arg1, arg2){
    ..code here
}
这就是为什么您可以在代码中声明函数之前调用它

但请注意,函数表达式不会被提升。因此,未吊装以下构件:

var functionName = function(arg1, arg2){
    ..code here
};
因此,下面将抛出错误:

functionName(); //TypeError, undefined is not a function!
var functionName = function(arg1, arg2) {
    console.log(arg1);
};
添加:: 考虑函数表达式的一个例子::

saySomething(); //You get error here
var saySomething = function() {
    console.log("Hi there!");
};
这将不起作用并抛出错误,因为变量声明和函数声明被提升,但在上面的函数表达式示例中,它的变量声明和赋值被提升。变量声明被挂起,但赋值仍保留在原来的位置。因此,结果将是:

var saySomething;
saySomething(); //you get error here, which should be clear now as why you get the error
saySomething = function() {
    console.log("Hi there!");
};

虽然您的答案是一个很好的解释,但您的第二个片段是不正确的。您需要删除
var a=
部分,因为这将是一个函数表达式,与第一个代码段中的函数声明大不相同。简单地交换第一个代码段的行就足以作为一个描述提升的示例。对于pedantic,提升了
var functionName
,但是
functionName=function…
赋值不正确;能正常工作吗?