错误TypeError:this.setNormal不是函数-角度

时间:2019-01-22 15:37:28

标签: javascript

我正在尝试使用this关键字在函数内部调用函数。但我收到类似

的错误
ERROR TypeError: this.setNormal is not a function

据我所知,我在内部调用函数的方式可能是错误的原因。请纠正我的方法。

// first function
fun1 (){
    setTimeout(function() {
        this.setNormal();
    }, 2000);
}

// second function
setNormal(){

}

2 个答案:

答案 0 :(得分:2)

更改

setTimeout(function() {

setTimeout(() => {

arrow function将允许您在setTimeout回调函数内使用thisthis指向该函数之外的对象)。

答案 1 :(得分:2)

问题在于:

// first function
fun1 (){
    setTimeout(function() {
        this.setNormal();
    }, 2000);
}

// second function
setNormal(){

}

这是您自定义this以来使用的function(){}语法的方式。如果您阅读了setTimeout

的规范
  

由setTimeout()执行的代码从执行上下文中调用   与调用setTimeout的函数分开。通常   为被调用函数设置this关键字的规则适用,并且   如果您尚未在通话中设置此设置,也未设置为绑定,则默认设置为   非严格模式下的全局(或窗口)对象,或者在   严格模式。它与的this值不同   名为setTimeout的函数。

我假设您没有在全局范围内定义setNormal,因此出现了问题。

现在,在ES6中,许多人使用() => {}函数语法在封闭范围内对此进行了关闭。

  

箭头函数本身没有此函数。这个值   使用封闭的词汇上下文,即,箭头函数跟随   正常的变量查找规则。所以在寻找这个不是   在当前范围内存在,他们最终从其封闭中发现了这一点   范围。