【问题标题】:Recurrent inline versus function within function?循环内联与函数内函数?
【发布时间】:2014-02-13 05:14:19
【问题描述】:

我有一种情况,我正在编写多个共享一种工作方法的函数,并且我真的很想重构和整理这段代码,而不是让这些相同的块无数次出现,只是为了执行细微的差异。给定一个信息块,我扫描每个条目并对相关块执行操作。循环函数的一个例子如下:

    function basicFunc() {
        var totalX = 2000, totalY = 2000;
        for (var y = 0; y < totalY; y++) {
            for (var x = 0; x < totalX; x++) {
                  /* Fake operation for theory */
                  var fakeVar = (y * x);
            }
        }
    };

比较:

    function eachBlock(whatToDo, totalX, totalY) {
        for (var y = 0; y < totalY; y++) {
            for (var x = 0; x < totalX; x++) {
                 /* Fake operation for theory */
                 return whatToDo;

            }
        }
    };
    function basicFunc() {
        var totalX = 2000, totalY = 2000;
        eachoBlock("var fakeVar = (y * x)", totalX, totalY);
    };

这适用于作为whatToDo 参数传递的单行。您将如何将多行传递给eachBlock(),比如说如果您有一堆操作要做而不是一个var FakeVar 操作?

TLDR:如何在函数中使用函数调用来包装它在成为单独函数之前执行的原始代码块?

【问题讨论】:

  • 顺便说一句,块(例如函数体)之后不需要分号。
  • 你为什么不简单地传递一个函数whatToDo 而不是一个字符串'full of operations'?
  • 这正是我在 Tyblitz 得到的要点。我不知道这样做的最佳或正确做法。
  • 哦!这很简单:您可以在 eachBlock 函数中包含一个未命名的函数(如 minitech 的答案),或者将您想要执行的操作存储在另一个命名函数中,就像您对 eachBlock 所做的那样。像这样:1) function whatToDo1() { var fakeVar = (y * x); }2) eachBlock(whatToDo1, 2000, 200) 这样做的唯一(也是很大)好处是可读性 - 注意:您的代码根本没有错误,它的格式很好(除了您在这个问题中提出的问题)

标签: javascript function parameters operators wrapper


【解决方案1】:

return whatToDo; 在您的“更快”示例中会立即跳过两个循环并退出函数。它们的效果不同,因此您的基准不适用。

无论如何,怎么做:传递一个函数,调用该函数。 JavaScript 没有太大的区别,这是它最有用的特性之一。

function eachBlock(whatToDo, totalX, totalY) {
    for (var y = 0; y < totalY; y++) {
        for (var x = 0; x < totalX; x++) {
             /* Fake operation for theory */
             whatToDo(y, x);
        }
    }
}

function basicFunc() {
    var totalX = 2000, totalY = 2000;
    eachoBlock(function(y, x) {
        var fakeVar = (y * x);
        …
    }, totalX, totalY);
}

【讨论】:

  • 好点;删除。除了基准,您对当前问题有何看法。
  • @user3223880:我仍然不确定您要做什么,因为将字符串传递给函数也不会评估该字符串中的代码。如果你想要某种回调,你可以传入一个函数,而不是字符串。
  • 这就是我不确定的地方。除了我的错误(显然很多),最简单的方法是什么?我想在basicFunc 中的操作或多或少地插入到eachBlock 的循环中,这样我就可以调用并传递它每次需要循环序列时要做什么。
  • @user3223880: eachoBlock(function() { /* do things */ }, totalX, totalY);eachoBlock, whatToDo();。一流的功能。
  • 在快速的 JSPerf/Litmus 下,这个函数调用仍然快了一点。感谢您帮助我意识到我对这个问题的思考程度。简单的匿名函数传递将清理数百行代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2018-12-06
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多