我想运行一个随机函数。我的代码如下所示:
module A {
...
export function foo(): number {
let b = new B();
let possibleFunctions = [
b.possibleFunction1,
b.possibleFunction2
];
let index = Math.floor(Math.random() * 2);
possibleFunctions[index](_var_);
}
class B {
public usefulFunction() {
console.log("bbbb");
...
}
public possibleFunction1() {
...
console.log("aaaa");
this.usefulFunction(); // <-- IS NOT CALLED
console.log("cccc");
}
public possibleFunction2() {
...
}
}
}
输出似乎只有aaaa
,函数usefulFunciton
永远不会被调用(它会出错)。
如果我更换
possibleFunctions[index](_var_);
通过
possibleFunction1(_var_);
一切正常。
所以我很想知道:
1。 我的观察结果是否正确?
2. 为什么会这样?函数是深层复制的还是什么?
3。 这样做的正确方法是什么?
谢谢!
答案 0 :(得分:3)
您的问题是由javascript中this
关键字的怪异造成的。它的行为与任何其他通用语言不同。简单地说,根据您调用函数的方式,您可以获得this
的不同对象。克服这个问题的一种方法是调用这样的函数:
possibleFunctions[index].apply(b, argsArray);
apply
的第一个参数是this
可用的对象,第二个是函数的参数数组。
正如@Ced建议的另一种方法是bind
你的功能来纠正这个问题。
let possibleFunctions = [
b.possibleFunction1.bind(b),
b.possibleFunction2.bind(b)
];
无论您调用该函数的方式如何,都会强制this
为b
。