2012-11-15 32 views
2

我面临的情况是,我需要将相同的代码块添加到JavaScript中多个函数的开始和结尾。例如将相同的代码添加到多个函数中

function funcA() { 
    // code block 1 
    ... 

    // code unique to funcA 
    ... 

    // code block 2 
    ... 
} 

function funcB() { 
    // code block 1 
    ... 

    // code unique to funcB 
    ... 

    // code block 2 
    ... 
} 

function funcC() { 
    // code block 1 
    ... 

    // code unique to funcC 
    ... 

    // code block 2 
    ... 
} 

我不知道什么是用在这里,以尽量减少重复正确的模式。

+1

为什么不使用函数代码块1和2? – adammenges

+1

@InBetween,我希望是否有类似于Python中的装饰器的方式... – MLister

+0

我提供了一个模式,解决了这个问题。这就像一个饮食装饰者。 – elucid8

回答

3

你可以使用其他功能来构建功能为您提供:

function makeFunc(specialProcessing) { 
    return function() { 
    // block 1 
    specialProcessing(x, y, z); 
    // block 2 
    }; 
} 

var func1 = makeFunc(function(x, y, z) { 
    // stuff for func1 
}); 

var func2 = makeFunc(function(x, y, z) { 
    // stuff for func2 
}); 
+1

这看起来好像比简单地将重复的代码抽取到一个单独的函数中更不易读和更难使用。 –

+2

+1函数工厂*(或装饰器,或其他)*是一个很好的干净的方式,当有几个这样的功能。 –

6

它被称为提取方法重构。

function block1() 
{ 
    // code block 1 
} 

function block2() 
{ 
    // code block 2 
} 

function funcA() { 
    block1(); 

    // code unique to funcA 
    .... 

    block2(); 
} 
function funcB() { 
    block1(); 

    // code unique to funcB 
    .... 

    block2(); 
} 
function funcC() { 
    block1(); 

    // code unique to funcC 
    .... 

    block2(); 
} 
+0

这是可读的,但我不知道这是不是同一个问题。最后你要重复block1()和block2()调用。 – y2josei

1

如果在这些块可以通过简单地改变变量在使用时,那么应该提取码的那些块,以单独的方法普遍被应用到每个函数中,代码相当大的块。这有助于促进代码重用,提高代码的可读性,并使测试和调试变得更加容易,特别是如果您遵循测试驱动的开发理念,甚至只是运行自己的功能测试。一直以来,良好的软件工程和设计都是为了创建在许多地方很有用的小型方法,以减少您必须完成的工作并减少代码中的错误数量。

1

块可以提取到的功能和使用方法,适用叫。这将保持上下文并转发传递给原函数的任何参数。

function funcA() { 
    block1.apply(this, arguments); 

    // specific code to funcA 

    block2.apply(this, arguments); 
} 

参数将包含传递给父函数

0

如果你知道我永远不会设置像任何参数,你不希望有这里面实际的函数调用,或者可能会有不同的命令,我总是喜欢设置一个函数来为我调用函数调用。

jsFiddle DEMO

// Set up dynamically to handle calling any number of functions 
// in whatever order they are specified in the parameters 
// ie: setupFunctionOrder(func1, func2, func3, func4); 

function setupFunctionOrder() { 
    for (i = 0; i < arguments.length; i++) { 
     arguments[i](); 
    } 
} 

function block1() { log('\nblock1 - running'); } 
function block2() { log('block2 - running'); } 
function funcA() { log('funcA - running'); } 

// ** Useage: 
// now we make the actual call to set up the ORDER of calling -funcA- 
setupFunctionOrder(block1, funcA, block2); 
0

只是通过在你想成为独特的功能。就像这样:

function reusableFunc(fn) { 
    //reused code block here 
    fn(); 
    //reused code block here 
} 

var myResuableFunc1 = function (args) { 
    reusableFunc(function() { 
     //do your business here.  
    }); 
}; 


var myResuableFunc2 = function (args) { 
    reusableFunc(function() { 
     //do your business here.  
    }); 
}; 

//Or another way 
function myResuableFunc3(args) { 
    reusableFunc(function() { 
     //do your business here 
    }); 
} 

然后,您可以根据需要创建使用共享代码尽可能多的功能,并通过关闭的权力,来传递你喜欢的任何方式将这些新创建的功能。

相关问题