我正在处理一个太复杂的功能(处理器),因此我将部分功能嵌入其中的嵌套“实用程序功能”(print)中。它的简化版本如下所示:
var out = document.getElementById( "output" );
function processor ( n ) {
function print( msg ) {
out.innerHTML += msg;
}
while ( n > 0 ) {
print( n-- );
print( ", " );
}
print( "<br/>" );
}
for ( var i = 0; i < 10; i++ ) {
processor( i );
}
您可以在this JSfiddle中看到它。
问题是:我真的在创建效用函数print()
的10个实例吗?如果是,那么在不将效用函数放在processor()
函数之外的情况下编写此代码的更有效方法是什么?我希望print()
函数只能在processor()
中访问,而不能在其他地方访问。一种解决方案是命名空间。
我已经阅读了这个问题,即使它有关系,但这不是我的答案: Efficiency of creating an event handler in a nested loop: am I creating 1440 functions here?
答案 0 :(得分:3)
在JavaScript术语中,您是是。但是,实际上JavaScript引擎本身可能会重新使用定义函数的代码,并适当调整范围以便重用。我已经阅读了这种方法being used in Chromium。
要仅在processor()
中访问打印功能,您必须创建IIFE:
var out = document.getElementById( "output" );
var processor = (function () {
function print( msg ) {
out.innerHTML += msg;
}
return function ( n ) {
while ( n > 0 ) {
print( n-- );
print( ", " );
}
print( "<br/>" );
};
}());
for ( var i = 0; i < 10; i++ ) {
processor( i );
}
你在这里而不是在循环中重新创建函数的原因是因为function
(例如processor
)定义了一个新范围,其中 - 作为块(循环等)别&#39;吨;函数声明被提升到范围的顶部,而不是块。
答案 1 :(得分:1)
简而言之,是的,你是。但由于它们都是本地函数,它们将从函数堆栈中弹出并在函数返回时被销毁。由于您在for循环中连续调用processor()
函数,因此只有print()
函数的一个实例在任何时间点都有效且可访问。