2017-04-19 20 views
1

次の関数を再帰的に呼び出そうとしています。私は、未定義の 『のgetDataに』 "プロパティを読み取ることができません。それは、エラーを示すたtehの関数を呼び出すことを試みたtypescript/javascriptの再帰関数

public getData(key,value){ 

    this.htmlString += '<span style="color:cornflowerblue">'+key+' </span>:'; 

    if(value instanceof Object){ 
     Object.keys(value).forEach(function (keydata) { 
     let obj = value[keydata]; 
     this.getData(keydata,value[keydata]); 

     console.log(key,obj,obj instanceof Object) 
     }); 
    }else{ 
     this.htmlString += '<span>'+value+'</span>'; 
    } 
    return this.htmlString; 
    }; 

。コードまたはこれを行うには、他の方法で任意の間違っあります。

答えて

5

forEach受け入れ。

012:匿名関数であり、匿名関数の内部 thisがstrictモードで非strictモードまたは undefinedwindowを指し

あなたはコンテキストをバインドする必要があり、コールバック、

または矢印の機能を使用します。

Object.keys(value).forEach((keydata) => { 
    let obj = value[keydata]; 
    this.getData(keydata,value[keydata]); 

    console.log(key,obj,obj instanceof Object) 
    }); 

を、または単にforEachに2番目の引数としてthisへのポインタを渡します

Object.keys(value).forEach(function (keydata) { 
    let obj = value[keydata]; 
    this.getData(keydata,value[keydata]); 

    console.log(key,obj,obj instanceof Object) 
    }, this); 
+1

あなたはまた、渡すことができます[* thisArg *](のhttp:/ /ecma-international.org/ecma-262/7.0/index.html#sec-array.prototype.foreach)を2番目のパラメータとして使用します。 * this *は "コンテキスト"ではなく、実行コンテキストのパラメータです。 – RobG

+0

@RobG、ありがとう、私はそれを知らなかった。それはおそらく新しいものです。私は答えを編集しました –

+0

* forEach *は[* ECMAScript ed 5 *](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18)で導入されました。 ;-) – RobG