Javascript 循环内联与函数内函数?
我曾经遇到过这样一种情况:我正在编写多个共享一种工作方法的函数,并且非常希望重构和整理这些代码,而不是让这些相同的块无数次出现,只是为了执行细微的差异。给定一个信息块,我扫描每个条目并对有问题的块执行操作。递归函数的示例如下所示:Javascript 循环内联与函数内函数?,javascript,function,parameters,operators,wrapper,Javascript,Function,Parameters,Operators,Wrapper,我曾经遇到过这样一种情况:我正在编写多个共享一种工作方法的函数,并且非常希望重构和整理这些代码,而不是让这些相同的块无数次出现,只是为了执行细微的差异。给定一个信息块,我扫描每个条目并对有问题的块执行操作。递归函数的示例如下所示: function basicFunc() { var totalX = 2000, totalY = 2000; for (var y = 0; y < totalY; y++) { for (va
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);
}
}
};
函数basicFunc(){
var totalX=2000,totalY=2000;
对于(变量y=0;y
与之相比:
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);
};
函数eachBlock(whatToDo、totalX、totalY){
对于(变量y=0;y
对于作为whatToDo
参数传递的单行来说,这很好。如果要执行一个var FakeVar
操作,而不是一个var FakeVar
操作,那么如何将多行传递给eachBlock()
TLDR:如何在函数中使用函数调用来包装它在成为单独函数之前执行的原始代码块操作?
返回whatToDo在您的“更快”示例中,code>会立即跳过两个循环并退出函数。它们没有相同的效果,因此您的基准不适用
无论如何,如何做:传递函数,调用函数。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);
}
函数eachBlock(whatToDo、totalX、totalY){
对于(变量y=0;y
顺便说一句,在块(例如函数体)之后不需要分号。为什么不简单地将函数作为whatToDo
传递,而不是字符串“充满操作”?这正是我在Tyblitz中得到的要点。我不知道这样做的最佳或正确的做法。哦!这很简单:您可以在eachBlock函数中包含一个非命名函数(如minitech的答案),也可以像为eachBlock所做的那样,将要执行的操作存储在另一个命名函数中。像这样:1)函数whatToDo1(){var fakeVar=(y*x);}
2)每个块(whattodo1200200)
这样做的唯一(也是最大)好处是可读性——注意:你的代码一点都没有错,格式很好(除了你在这个问题中提出的问题)非常好;远离的。撇开基准测试不谈,你对这个问题的看法是什么。@user3223880:我仍然不确定你想做什么,因为将字符串传递给函数也不会计算该字符串中的代码。如果你想要某种回调,你应该传入一个函数,而不是字符串。这就是我不确定的地方。撇开我的错误不谈(显然很多),最简单的方法是什么?我想将basicFunc
中的操作或多或少地插入到eachBlock
的循环中,这样我就可以调用并传递每次需要循环序列时要执行的操作。@user3223880:eachBlock(function(){/*do things*/},totalX,totalY)代码>和在eachoBlock
,whatToDo()代码>。第一类函数。在快速的JSPerf/Litmus下,这个函数调用仍然要快一点。谢谢你帮助我意识到我对这个问题考虑得太多了。简单的匿名函数传递是,并且将清理数百行代码。