2

主な関心事は効率です。

私はjavascriptスコープに取り組んでおり、混乱しているthisのは関数内にあります。

私は多くの回答を読み、それらを理解しています。しかし、私が気になるのは効率です。私のコードを見てください。

  class Fancy {
    constructor () {
  }

  checkScope (callback) {
    console.log('Inside checkScope');
    callback ();
  }
}

class Prog {
  constructor () {
    this.name = 'myProg';
    this.fancy = new Fancy ();
  }

  run () {
    var that = this;
    this.fancy.checkScope(function () {
      console.log('Name ', that.name);
    });
  }
}

var prog = new Prog ();
prog.run();

run()私はの参照をthisローカル変数に保存していますthat。これは私のために働いています。しかし、それは安全ですか?効率的ですか?いいえの場合は、良い戦略/トリックを提案してください。

ありがとう :)

4

1 に答える 1

2

はい、安全ですが、新しい矢印構文を使用できますthis

 class Fancy {
    constructor () {
  }

  checkScope (callback) {
    console.log('Inside checkScope');
    callback ();
  }
}

class Prog {
  constructor () {
    this.name = 'myProg';
    this.fancy = new Fancy ();
  }

  run () {
    // Here your don't need var that = this, 
    // because the arrow function gets the same this
    this.fancy.checkScope( () => {
      console.log('Name ', this.name);
    });
  }
}

var prog = new Prog ();
prog.run();

すべての単純な関数にはそれがありthisます、あなたの場合はあなたの

 function () {
      console.log('Name ', this.name); // this is undefined in 'strict mode'
    }

独自のものがあります。そのため、関数の外側を保持し、関数内でエイリアスを使用する必要があります。新しいthis.In があります。をオーバーライドしないでください。あなたの場合thisES6arrow syntax functionArrow functionsthis

run () {

        this.fancy.checkScope( () => {
          console.log('Name ', this.name);
        });
      }

と のはthis同じです。これは、が定義されたもの を参照することを意味します。run functionparameter functionarrow function scopethisthisarrow function

効率的な場合、追加の変数は必要ありません。追加の変数でローカルスコープを汚染しません。性能には影響ありません。

于 2016-09-01T07:41:31.053 に答える