嵌套功能:我在这里创建了10个函数吗?

时间:2012-07-02 12:46:30

标签: javascript

我正在处理一个太复杂的功能(处理器),因此我将部分功能嵌入其中的嵌套“实用程序功能”(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?

2 个答案:

答案 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()函数的一个实例在任何时间点都有效且可访问。