范围:如何在打字稿中访问/操作全局变量

时间:2017-03-28 09:31:29

标签: typescript scope ionic2

我在typescript / ionic 2中构建一个算法,需要一个函数层次结构(函数内的函数)。我99%确定没有办法避免使用嵌套函数,因为谷歌API(需要很长的解释,只相信我)

我将使用一个简单的演示来说明我的问题,以避免发布300行代码。

问题涉及在嵌套函数中访问和操作全局变量。我需要一种在secondSet函数中设置this.secondvar的方法。有没有办法实现这个目标?

export class HomePage {

  public firstVar = [];
  public secondvar;
  constructor(public navCtrl: NavController) {

  }

  ionViewDidLoad(){
    this.setVar();
  }

  setVar(){
    this.firstVar.push("hello", "goodbye");
    console.log();
    getVar();

    function getVar(){
      //console.log(this.lol); unable to access
      secondSet();

      function secondSet(){
        console.log("test")
        //this.secondVar = "hello" //how do i set this ?
      }
    }
  }
}

3 个答案:

答案 0 :(得分:2)

使用Arrow functions,它取决于类的范围。它不会有自己的this值。

setVar(){
 this.firstVar.push("hello", "goodbye");
 console.log();

let getVar=()=>{
  //console.log(this.lol); unable to access

  let secondSet=()=>{
    console.log("test")
    //this.secondVar = "hello" //how do i set this ?
  }
        secondSet();

}
     getVar();
}
  

函数调用定位背后的原因是什么?为什么在声明函数后调用它们?

这是因为使用了letlet变量声明是block scoped。 根据文件:

  块范围变量的

属性是它们无法读取或   在他们实际宣布之前写的。虽然这些变量是   在他们的范围内“呈现”,直到他们的所有点   宣言是他们临时死区的一部分。

所以:

     secondSet();//throws error

  let secondSet=()=>{
    console.log("test")
    //this.secondVar = "hello" //how do i set this ?
  }

答案 1 :(得分:0)

使用上下文变量。将“this”的值分配给局部变量,例如“context”。使用“context”变量作为“this”。

export class HomePage {

  public firstVar = [];
  public secondvar;
  constructor(public navCtrl: NavController) {

  }

  ionViewDidLoad(){
    this.setVar();
  }

  setVar(){
     var context = this;
    this.firstVar.push("hello", "goodbye");
    console.log();
    getVar();

    function getVar(){
      //console.log(this.lol); unable to access
      secondSet();

      function secondSet(){
        console.log("test")
        context.secondVar = "hello" // This is how you access the secondVar 
      }
    }
  }
}

答案 2 :(得分:0)

您可以将内部函数定义为箭头函数(lambdas),这将保留“this”的上下文。所以像这样:

var secondSet = () => { this.secondVar = 'whatever' };

如果查看已编译的javascript,它会自动将'this'的值保存到变量中并在lambda中使用它。