匿名函数内部的Does函数(callbacks")在每次回调时在内存中被重新定义
Does functions inside anononymus functions ("callbacks") gets redefined in memory on each callback?
如果您在匿名函数中定义函数,例如将"callback"函数用作参数。以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);
我想这是一个更"合适"的闭包。
这有什么区别吗?
函数showValue会被"重新定义"3次吗?
理论上,是的。实际上,JavaScript引擎真的很聪明。如果按照上面所示的操作,引擎几乎肯定会完全优化函数,将其代码内联。如果函数更复杂,不适合内联,引擎仍然可能只编译一次函数,并在每次迭代时更改其上下文。
有区别吗?
只有一个小的:在迭代完成后,内存中仍然有handleItem
函数。showItem
没有变化。
这个变化呢?我想这是一个更"合适"的结尾。
在迭代完成后,您将拥有handleItem
,并且所有迭代都将使用相同的showItem
,在迭代完成后,它仍然存在。(旁注:var handleItem = (function(item) {
中的item
是误导性的,您不接受那里的item
。)
你认为其中一个变体在某种程度上比其他变体"更好"吗?
对于我来说,给定问题中的代码,答案是"以上皆非"。而不是:
['one', 'two', 'three'].forEach(function(i) {
console.log(i);
});
我不认为真的有一个普遍的案例答案。这完全取决于handleItem
和showItem
实际做什么,它们有多复杂,你是否要重用它们,showItem
是否需要做特定于handleItem
的特定调用的事情(除了项目不同),等等。
相关文章:
- Object.assign(),函数方法和内存使用
- 在构造函数中定义函数会比将其附加到原型消耗更多的内存
- 避免将jquery选择器作为构造函数参数发送时内存泄漏
- 将pased函数的参数存储在我的内存函数中
- 测量JavaScript函数的内存使用情况、执行时间和性能
- Javascript中的匿名函数和传统函数之间有什么内存使用差异吗?如果是这样,如何
- 为什么这个函数会占用大量的内存
- 在 javascript 函数和内存管理中声明变量
- 将文字/对象/类传递给具有数千次调用的函数的内存含义
- 为什么此函数会导致内存泄漏
- JavaScript 声明的函数在脚本加载时消耗多少内存
- 在函数中创建 jQuery 对象然后不使用它是否会产生内存泄漏
- 用作 Jquery 回调时匿名函数与命名函数的内存开销
- 内存中函数的大小
- javascript/nodejs:在大的、分块的数据集上同步调用一组类似的异步函数会导致内存泄漏
- 删除脚本元素是否会从内存中删除其函数
- 是否可以将Javascript函数存储在内存中,以便在网站的多个页面上使用
- 用JavaScript重新创建一个函数需要多少内存
- 为什么函数中改变的对象会改变它们在内存中指向的内容,但有时会创建一个新的内存对象
- 这个函数是否存在内存泄漏?