哪种JavaScript函数放置方式更好?

6

我正在尝试制作一个游戏,注意到为了组织代码,将一些只会在原始函数中使用的函数放置在其他函数内部可能更好。例如:

function fn1()
{
    fn2();

    function fn2()
    {
        //Stuff happens here
    }
}

fn1会被多次调用,在其执行过程中也会多次调用fn2。当fn1被调用时,fn2是否每次都需要重新处理?这样做是否会影响性能?我应该像这样将fn2放在fn1后面吗?

function fn1()
{
    fn2();
}

function fn2()
{
    //Stuff happens here
}
1个回答

2

您可以通过以下方式实现类似的作用域,但只创建一个fn2副本:

//Initiliaze before you call `fn1`:  
var fn1 = (function(){

    // This is the function assigned to fn1
    return function(){
        fn2();
    }

    function fn2()
    {
        //Stuff happens here
    }
})();

比较这两个fiddle的控制台输出,前者创建了一个额外的fn2副本,因为每次调用fn1时都会创建一个局部作用域的fn2http://jsfiddle.net/A2UvC/3/http://jsfiddle.net/A2UvC/3/ 然而,额外的fn2也有优点。它们可以访问不同的变量,就像以下情况:
function fn1(x){

    // Return an object exposing fn2 to the caller's scope
    return {fn2: fn2};

    // Each call to fn1 creates a new fn2 which has access 
    // to the closured `x` from the call to fn1 that created it
    function fn2(){
        console.log(x);
    }

}

var ex1 = fn1(1);
var ex2 = fn1(2);

ex1.fn2 == ex1.fn2; // true
ex1.fn2 == ex2.fn2; // false, because they are two distinct copies

ex1.fn2(); // 1
ex2.fn2(); // 2
ex2.fn2(); // 2
ex1.fn2(); // 1

由于您没有将函数表达式括在括号中,也许您想明确指出您正在立即调用外部函数。相关阅读材料:http://benalman.com/news/2010/11/immediately-invoked-function-expression/. - Felix Kling
1
@FelixKling 我添加了括号以使其更明显。 - Paul
1
+1 :-) 另外,你能解释下原帖中的第一种方法是否会创建多个 fn2 的副本吗? - Harsha Venkataramu
我一直在研究这个,因为我不认为我完全正确理解了这个。在你的第一个例子中,你正在创建一个返回函数的函数,以便它可以被“注入”到任何其他函数中,对吗?至于你的第二个例子,考虑到fn2将仅由fn1访问,如果我要制作多个副本,为什么不在fn1内部定义fn2呢?此外,这两个fiddles链接到相同的内容。 - Rstevoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接