gpt4 book ai didi

具有立即调用函数的 Javascript 提升过程 : Why doesn't this declared function run before function expression?

转载 作者:行者123 更新时间:2023-11-30 00:32:14 25 4
gpt4 key购买 nike

代码:

var funcExpression = function(){
alert("function expression");
}();

(function declarFunc(){
alert("declared func");
})();

结果是函数 Expression 首先运行导致警告 "function expression" 声明的函数第二个运行 "declared func “

我知道在提升过程中,声明的函数完全在其容器内提升并加载到内存中。然而,函数表达式并没有被提升:它们停留在同一个地方并且直到运行时才加载到内存中(尽管指向函数表达式的变量被提升并设置为 Undefined (这个概念有误请指正)

由于声明的函数被提升到函数表达式赋值之上,因此我希望首先执行声明的函数:导致警告 "declared func" 之后执行函数表达式:导致 "function expression" 的第二个警报。

但是:它没有达到我的预期。因此,它似乎与这两个函数的立即调用有关。也许立即调用保持相同的顺序?也许在提升过程之后代码真的是这样的:

var funcExpression = Undefined;

(function declarFunc(){
alert("declared func");
})

funcExpression = function(){
alert("function expression");
}();

(); // this executes declarFunc. Maybe declarFunc is hoisted up
// but the invoking part stays in the same place?

最佳答案

反馈和额外研究后的解决方案

答案是这两个函数都是函数表达式:

代码:

var funcExpression = function(){
alert("function expression");
}();

(function declarFunc(){
alert("declared func");
})();

所以 declareFunc() 看起来像一个已声明的函数,但由于它像那样被包裹在括号中,所以它将它转换为一个命名函数表达式。后面的括号立即唤起了这个函数表达式。

我无法显示代码在提升过程后的样子,因为 (function declarFunc(){...})() 转换为命名函数表达式 由于那些包装括号。这意味着在此命名函数范围之外,我们无法调用它。

示例:如果在这些函数之后我执行了 declarFunc(),它将返回错误:ReferenceError: Can't find variable: declarFunc.

如果我们确实想让运行这个函数表达式成为可能,那么我们会想要将函数表达式分配给一个变量:

var foo = function declarFunc(){
alert("declared func");
};

注意:如果我们查看控制台,我们会看到 console.log(foo()) 将返回 undefined,但是该功能的 Action 仍将发生。只要知道,如果没有指定 return 语句,那么它会隐式返回 undefined

现在我们可以使用 foo() 多次调用该函数。

关于具有立即调用函数的 Javascript 提升过程 : Why doesn't this declared function run before function expression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29013838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com