gpt4 book ai didi

javascript - 匿名函数 ("callbacks") 内的函数是否会在每次回调时在内存中重新定义?

转载 作者:行者123 更新时间:2023-12-02 15:47:05 26 4
gpt4 key购买 nike

如果您在匿名函数内定义函数,例如用作参数的“回调”函数。我们以 Array.prototype.forEach 为例:

['one','two','three'].forEach (function(item) {
function showValue(i) {
console.log (i);
}
showValue(item);
});

函数showValue会被“重新定义”3次吗?

如果我们在此变体中编写该代码:

function handleItem(item) {
function showValue(i) {
console.log (i);
}
showValue(item);
}
['one','two','three'].forEach (handleItem);

有什么区别吗?内存方面或其他方面。

这个变体怎么样:

var handleItem = (function(item) {

function showValue(i) {
console.log (i);
}

return function(item) {
showValue(item);
}

})();


['one','two','three'].forEach (handleItem);

我认为这是一个更“适当”的关闭。
这会有什么不同吗?

最佳答案

Will the function showValue be "redefined" 3 times?

理论上是的。实际上,JavaScript 引擎非常智能。如果你真的按照你所展示的那样做,引擎几乎肯定会完全优化该函数,内联其代码。如果函数更复杂并且不适合内联,引擎仍然可能会编译该函数一次,并在每次迭代时更改其上下文。

Is there a difference? memory-wise or otherwise.

只有一小部分:迭代完成后,内存中仍然存在 handleItem 函数。就 showItem 而言,没有任何变化。

What about this variation? Which I guess is a more "proper" closure.

迭代完成后,您将拥有 handleItem,并且所有迭代都将使用相同的 showItem,它在迭代完成后也仍然存在。 (旁注:var handleItem = (function(item) { 中的 item 具有误导性,您不接受其中的 item。)

<小时/>

Do you think one of the variations is "better" somehow than the rest?

对我来说,鉴于问题中的代码,答案是“以上都不是”。相反:

['one', 'two', 'three'].forEach(function(i) {
console.log(i);
});

我认为没有真正的通用案例答案。这完全取决于 handleItemshowItem 实际执行的操作、它们的复杂程度、您是否要重用它们、showItem 是否需要执行特定于给定调用 handleItem 的操作(除了项目不同之外)等,等等。

关于javascript - 匿名函数 ("callbacks") 内的函数是否会在每次回调时在内存中重新定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32115671/

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