Typescript:var中的方法不能调用另一个方法吗?

时间:2017-02-08 07:18:18

标签: typescript

我想运行一个随机函数。我的代码如下所示:

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。 这样做的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题是由javascript中this关键字的怪异造成的。它的行为与任何其他通用语言不同。简单地说,根据您调用函数的方式,您可以获得this的不同对象。克服这个问题的一种方法是调用这样的函数:

 possibleFunctions[index].apply(b, argsArray);

apply的第一个参数是this可用的对象,第二个是函数的参数数组。

正如@Ced建议的另一种方法是bind你的功能来纠正这个问题。

let possibleFunctions = [
       b.possibleFunction1.bind(b), 
       b.possibleFunction2.bind(b) 
    ];

无论您调用该函数的方式如何,都会强制thisb