【问题标题】:Which Javascript function placement is better?哪个 Javascript 函数放置更好?
【发布时间】:2013-08-26 18:36:21
【问题描述】:

我正在尝试构建一个游戏,我注意到对于组织来说,将一些函数放在其他函数中可能会更好,因为它们专门用于原始函数。例如:

function fn1()
{
    fn2();

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

fn1 被多次调用,fn1 将在其执行过程中多次调用fn2。当fn1 被调用时,fn2 是否每次都必须重新处理(因为没有更好的词)?我是否因此而在性能方面输了?我应该像这样将fn2 放在fn1 之后吗?

function fn1()
{
    fn2();
}

function fn2()
{
    //Stuff happens here
}

【问题讨论】:

    标签: javascript parsing scope


    【解决方案1】:

    您可以这样做来实现类似的作用域,但只创建一个fn2 的副本:

    //Initiliaze before you call `fn1`:  
    var fn1 = (function(){
    
        // This is the function assigned to fn1
        return function(){
            fn2();
        }
    
        function fn2()
        {
            //Stuff happens here
        }
    })();
    

    将这些控制台输出与 fiddles 进行比较,前者会创建一个额外的 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
    

    【讨论】:

    • 由于您没有将函数表达式括在括号中,也许您想明确指出您正在立即调用外部函数。相关阅读资料:benalman.com/news/2010/11/….
    • @FelixKling 我添加了括号以使其更明显。
    • +1 :-) 另外,您能否解释一下 OP 的第一种方式是否会创建 fn2 的多个副本
    • @FelixKling:感谢您的链接!
    • 我一直在看这个,因为我认为我没有完全正确理解这一点。在您的第一个示例中,您正在创建一个返回函数的函数,以便可以将其“注入”到任何其他函数中,对吗?至于您的第二个示例,鉴于 fn2 将由 fn1 独占访问,如果我要制作多个副本,为什么不在 fn1 中定义 fn2 呢?此外,这两个小提琴都链接到同一个东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2018-06-30
    相关资源
    最近更新 更多