在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么?
在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么?,javascript,loops,computation,Javascript,Loops,Computation,在JavaScript中,在循环中创建函数会浪费计算量的具体原因是什么 Douglas Crockford在JavaScript的第39页指出,“避免在循环中创建函数,这可能会造成计算上的浪费”。我似乎不明白为什么在循环内创建函数比在循环外创建函数更浪费。因为您正在创建多个函数对象,而不是只重用一个 创建相同函数的示例 for (var i = 0; i < 10; i++) { // v--creating identical function in each iteration
Douglas Crockford在JavaScript的第39页指出,“避免在循环中创建函数,这可能会造成计算上的浪费”。我似乎不明白为什么在循环内创建函数比在循环外创建函数更浪费。因为您正在创建多个
函数
对象,而不是只重用一个
创建相同函数的示例
for (var i = 0; i < 10; i++) {
// v--creating identical function in each iteration.
(function(j) {
var el = document.createElement('a');
el.onclick = function() { alert(j); };
document.body.appendChild(el);
})(i);
}
for (var i = 0; i < 10; i++) {
var el = document.createElement('a');
// ----------v---calling a reusable function
el.onclick = createHandler(i);
document.body.appendChild(el);
}
function createHandler(j) {
return function() { alert(j); };
}
for(变量i=0;i<10;i++){
//v——在每次迭代中创建相同的函数。
(职能(j){
var el=document.createElement('a');
el.onclick=function(){alert(j);};
文件.正文.附件(el);
})(i) );
}
重用命名函数的示例
for (var i = 0; i < 10; i++) {
// v--creating identical function in each iteration.
(function(j) {
var el = document.createElement('a');
el.onclick = function() { alert(j); };
document.body.appendChild(el);
})(i);
}
for (var i = 0; i < 10; i++) {
var el = document.createElement('a');
// ----------v---calling a reusable function
el.onclick = createHandler(i);
document.body.appendChild(el);
}
function createHandler(j) {
return function() { alert(j); };
}
for(变量i=0;i<10;i++){
var el=document.createElement('a');
//------------v---调用可重用函数
el.onclick=createHandler(i);
文件.正文.附件(el);
}
函数createHandler(j){
返回函数(){alert(j);};
}
这两个示例的结果相同,但第二个示例不需要在循环期间生成两个函数的开销。相反,它只创建一个处理程序。创建函数会占用大量资源。由于函数实际上是对象,因此代码每次都必须实际创建一个新的函数对象,它不能只创建一次,然后再重用它 在循环内创建函数通常意味着您将创建许多函数,而不仅仅是在循环外创建单个函数
所以,如果你能在循环外做一次,那就是不要在循环内做资源密集型的事情。当涉及到函数时,它们通常可以在循环之外创建,而不改变代码的逻辑。可能的重复?(这个讨论确实很有趣)在javascript中,函数是一级对象,所以当您使用函数表达式时,它总是创建一个新的函数对象。如果使用函数声明(与其他语言相比更具可比性),则该声明将被提升,甚至不会在循环中运行。@Esailija:除非您不应将函数声明放在循环的语句块中(即使某些实现仍将提升它)。它需要在循环之前或之后执行。@amnotiam true,只是为了“彻底性”而提到它:p很好的例子,代码有一种比文字更好的解释方式!非常感谢。