2017-03-28 2 views
0

함수 계층 구조 (함수 내의 함수)가 필요한 typescript/ionic 2에서 알고리즘을 작성합니다. 나는 99 % Google API (중대한 설명이 필요하고, 저를 신뢰해야 함) 때문에 중첩 된 함수를 피할 수있는 방법이 없다고 확신합니다.범위 : typescript에서 전역 변수에 액세스/조작하는 방법

나는 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 ? 
     } 
    } 
    } 
} 

답변

1

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 ? 
    } 
+0

"ts는"getVar "라는 이름을 찾을 수 없습니다. – Dansmith12

+0

sry..minor 오류는'let'을 사용합니다 .. 정의한 다음 –

+0

을 호출하십시오. 하나의 질문, 함수 호출의 위치를 ​​결정하는 이유는 무엇입니까? 함수가 선언 된 후 왜 호출됩니까? – Dansmith12

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 
     } 
    } 
    } 
} 
+0

많은 감사, 감사합니다. – Dansmith12

0

내부 함수를 'this'의 컨텍스트를 유지하는 화살표 함수 (lambdas)로 정의 할 수 있습니다. 이 같은 무언가 : 당신이 컴파일 된 자바 스크립트를 보면, 자동 변수에 '이'의 값을 저장하고 람다 것을 사용

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

.

+0

어떻게 그 함수를 호출해야합니까? – Dansmith12

+0

다른 함수와 마찬가지로 단지 secondSet()입니다. 또는 다른 방법으로 함수를 호출 할 수 있습니다 (호출, 적용). –

관련 문제