我有一个JavaScript函数:
function oneOf() {
return arguments[Math.floor(Math.random()*arguments.length)];
}
它被设计为接受可变数量的参数并吐出一个随机的参数,这是有效的。我无法获取对象方法列表并执行一个。我该怎么做?
答案 0 :(得分:1)
Function.prototype.apply
允许你" splat"参数列表中的数组:
function sayAll() {
console.log(arguments);
}
sayAll(1, 2, 3, 4);
// [1, 2, 3, 4]
sayAll.apply(null, ["a", "b", "c"])
// ["a", "b", "c"]
可以用括号调用函数(参见上文)。
结合这两个见解,我们得到以下结论:
function oneOf() {
var f = arguments[Math.floor(Math.random()*arguments.length)];
return f(); // Via insight #2
}
// Via insight #1
oneOf.apply(null, [someFunction, anotherFunction]);
如果这些功能是"方法"在一个对象上需要保留他们的this
上下文,那么我们需要第三个洞察力。
Function.prototype.bind
允许创建具有固定this
上下文的函数:
function sayWhatThisIs() {
console.log("This is", this);
}
var coolObject = {
cool: true,
sayWhat: sayWhatThisIs
};
coolObject.sayWhat();
// This is {cool: true, ...}
oneOf.apply(null, [coolObject.sayWhat.bind(coolObject),
sayWhatThisIs.bind(coolObject)]);
// Two variations of binding `sayWhatThisIs` to `coolObject`
我们还可以将this
的{{1}}上下文传递给Function.prototype.apply
:
oneOf