一个接收和返回函数的javascript函数

时间:2014-10-07 22:15:18

标签: javascript methods

我有一个JavaScript函数:

function oneOf() {
    return arguments[Math.floor(Math.random()*arguments.length)];
}

它被设计为接受可变数量的参数并吐出一个随机的参数,这是有效的。我无法获取对象方法列表并执行一个。我该怎么做?

1 个答案:

答案 0 :(得分:1)

洞察力#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"]

洞察力#2

可以用括号调用函数(参见上文)。

结合这两个见解,我们得到以下结论:

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上下文,那么我们需要第三个洞察力。

<3>洞察力#3

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`

洞察#3a

我们还可以将this的{​​{1}}上下文传递给Function.prototype.apply

oneOf