我在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 ?
}
}
}
}
答案 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();
}
函数调用定位背后的原因是什么?为什么在声明函数后调用它们?
这是因为使用了let
。let
变量声明是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中使用它。