【问题标题】:typescript to javascript call back function can not access typescript global variable [closed]typescript to javascript回调函数无法访问typescript全局变量[关闭]
【发布时间】:2019-04-15 05:26:36
【问题描述】:

我无法通过相同 typescript 方法传递的回调函数的 javascript 调用访问 typescript 全局变量。

这是 stackblitz 中的示例代码。

https://stackblitz.com/edit/angular-quhktp

在上面的例子中,在组件文件中声明的 incr 变量。我们直接使用的时候可以在clickthisfunction方法中访问。但是如果将相同的方法传递给 javascript 进行回调。回调函数被调用,但此方法无法访问 this.incr 变量。

【问题讨论】:

    标签: javascript angular typescript callback scope


    【解决方案1】:

    在 javascript 的函数中,this 指的是调用函数的对象。 因此,如果您调用this.clickthisfunction()this.incr 工作正常,但如果您将this.clickthisfunction 重新分配给其他变量,则该函数中的this 将不是您所期望的。这个MDN page 有更多关于this 工作原理的信息。

    要解决这个问题,有几个选项:


    绑定

    您可以通过调用 .bind 来更改函数中的 this 值。 您可以在constructor 中添加此行:

    this.clickthisfunction = this.clickthisfunction.bind(this);
    

    你也可以在传递给withargumentcallwithfunctionasargument之前绑定它, 但是绑定不是免费的,所以通常只做一次。


    箭头函数

    Arrow functions 处理 this 的方式不同——它们从外部范围捕获它,而不是使用调用函数的对象。

    通过用 this 替换函数声明

    clickthisfunction = () => {
    

    它将从构造对象时捕获this 值。 (如果您对它是如何获得 this 值感兴趣,请查看转译的代码, 这更有意义)。


    其中任何一个都应该修复 this 未定义,而您使用的主要是样式问题。唯一的区别是第一种方法会在原型上留下一个函数,而第二种方法只会在实例上保留这个函数。不过,这可能不会影响任何事情,除非你做了一些奇怪的事情。

    【讨论】:

    • 感谢 Nicholas 理解了这个概念。我使用箭头函数解决了我的查询。
    【解决方案2】:

    这里有一个小错误。传递时需要调用。

    这应该可以解决问题:

      clickthisargwithfunction() {
        withargumentcallwithfunctionasargument(this.clickthisfunction());
      }
    

    【讨论】:

    • 不,事实并非如此。我不想调用函数并将返回值作为参数。相反,我试图将 javascript 中的函数作为回调函数传递。
    • 那么当你尝试点击调用fn作为回调的按钮时的错误是无意的?
    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 2017-06-09
    • 2014-01-17
    • 1970-01-01
    • 2017-07-25
    • 2014-06-24
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多