gpt4 book ai didi

javascript - 干燥带有可选参数和回调的 JavaScript 函数

转载 作者:数据小太阳 更新时间:2023-10-29 04:46:22 24 4
gpt4 key购买 nike

在 Node.js 中,出于多种原因,习惯/推荐将回调作为最后一个参数传递给函数。也可能有一个或多个可选参数,我们希望在回调之前传递这些参数。你最终会看到很多非常重复的代码,比如

// receiveMessages([options], [callback])
function receiveMessages(options, callback) {
if(typeof options === 'function'){
callback = options;
options = {}; // or some other sensible default
}
//...
}

当然,添加额外的可选参数意味着添加额外的检查:

 // through([dest], [options], [callback])
function through(dest, options, callback) {
if(typeof dest === 'function'){
callback = dest;
dest = noop();
options = {};
}else if(typeof options === 'function'){
callback = options;
options = {};
}
// ...
}

编辑 此模式 appears all over标准库也是如此。

我可以想出一些 hacky 方法来解决这个问题,但我想知道是否有人有特别优雅或通用的解决方案来将参数绑定(bind)到正确的位置参数。

最佳答案

我想到的一件事是方法重载。从技术上讲,这在 JavaScript 中不受支持,但有一些方法可以实现这样的功能。 John Resig 在他的博客中有一篇关于它的文章:http://ejohn.org/blog/javascript-method-overloading/

此外,这是我的实现,它与 John Resig 的非常相似并且深受其启发:

var createFunction = (function(){
var store = {};

return function(that, name, func) {
var scope, funcs, match;

scope = store[that] || (store[that] = {});
funcs = scope[name] || (scope[name] = {});

funcs[func.length] = func;

that[name] = function(){
match = funcs[arguments.length];
if (match !== undefined) {
return match.apply(that, arguments);
} else {
throw "no function with " + arguments.length + " arguments defined";
}
};
};
}());

这使您能够多次定义相同的函数,每次使用不同数量的参数:

createFunction(window, "doSomething", function (arg1, arg2, callback) {
console.log(arg1 + " / " + arg2 + " / " + callback);
});

createFunction(window, "doSomething", function (arg1, callback) {
doSomething(arg1, null, callback);
});

这段代码定义了一个全局函数doSomething,一次有三个参数,一次有两个参数。如您所见,此方法的第一个缺点是您必须提供一个函数附加到的对象,您不能只说“在这里定义一个函数”。此外,函数声明比以前更复杂一点。但是您现在可以使用不同数量的参数调用您的函数并获得正确的结果,而无需使用重复的 if..else 结构:

doSomething("he", function(){});         //he / null / function(){}
doSomething("he", "ho", function(){}); //he / ho / function(){}

到目前为止,只有参数的数量很重要,但我可以考虑对此进行扩展,以对不同的数据类型使用react,以便还可以区分以下内容:

function doSomething(opt1, opt2, callback){
//some code
}

doSomething({anObject: "as opt1"}, function(){});
doSomething("a string as opt2", function(){});

尽管如此,这可能不是最好的方法,但在某些情况下可能很方便。对于很多可选参数,我个人喜欢 Pumbaa80 将这些选项放在一个必需的对象参数中的回答。

关于javascript - 干燥带有可选参数和回调的 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17377895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com