web-dev-qa-db-ja.com

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;
  };

関数を呼び出そうとしたときに、「未定義のプロパティ 'getData'を読み取れません。コードに問題があるか、これを行う他の方法がありますか?」というエラーが表示されました。

10
sravanthi

forEachは、匿名関数であるコールバックを受け入れます。匿名関数内のthisは、非厳密モードのwindowまたは厳密モードのundefinedを参照します。

コンテキストをバインドする必要があります:

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

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

または、矢印関数を使用します。

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

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

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

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

    console.log(key,obj,obj instanceof Object)
  }, this);
14
Maxim Koretskyi