有没有办法在javascript中进行以下工作?
var orders = [
{milk: true, sugar: "extra"},
{milk: false, sugar: "normal"}
];
function makeCoffee(sugar, milk) {
console.log(sugar);
console.log(milk);
}
orders.forEach(makeCoffee);
有没有办法在javascript中进行以下工作?
var orders = [
{milk: true, sugar: "extra"},
{milk: false, sugar: "normal"}
];
function makeCoffee(sugar, milk) {
console.log(sugar);
console.log(milk);
}
orders.forEach(makeCoffee);
正如我在评论中所说,在func.toString()
返回函数†</sup> 源的浏览器中,您可以解析签名并提取参数名称:
var arg_names = makeCoffee.toString()
.match(/function[^(]*\(([^)]*)\)/)[1].split(', ');
orders.each(function(order) {
makeCoffee.apply(null, arg_names.map(function(name) {
return order[name];
});
});
由于 JavaScript 不提供任何反射 API,这可能是唯一的方法。
如果您没有明确说明您的代码在哪些浏览器中受支持,这可能不起作用(我不知道 IE 返回什么func.toString
)。我仍然建议将对象作为参数传递。
†:函数的确切表示取决于实现。以下是规范中的相应描述:
返回函数的依赖于实现的表示。此表示具有 a 的语法
FunctionDeclaration
。请特别注意,在表示字符串中使用和放置空格、行终止符和分号是依赖于实现的。
到目前为止,我能想到的最好的是:
function makeCoffee() {
console.log(this.milk);
console.log(this.sugar);
}
orders.forEach(function(x) {makeCoffee.call(x)})
优点:
缺点(海事组织):
我推荐这个:
//Should go to config.js
var COFFEE_SUGAR_DEFAULT="normal";
var orders = [
{milk: true, sugar: "extra"},
{milk: false, sugar: "normal"}
];
function makeCoffee(coffeeDefinition) {
if (!coffeeDefinition.sugar) coffeeDefinition.sugar=COFFEE_SUGAR_DEFAULT;
if (!coffeeDefinition.milk) coffeeDefinition.milk=false; //might not be a real boolean
console.log(coffeeDefinition.sugar);
console.log(coffeeDefinition.milk);
}
orders.forEach(function(x) {makeCoffee(x)})
优点:
"decaffeinated":false
缺点: