Какой эффективный обходной путь для использования этого внутри анонимной функции?

Главное беспокойство - эффективность.

Я работаю над областями 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, Это работает для меня. Но безопасно ли это? Это эффективно? Если нет, предложите мне хорошую стратегию / трюк.

Спасибо:)

1 ответ

Решение

Да, это безопасно, но вы можете использовать новый синтаксис стрелки. 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. Так что вам нужно сохранить this вне функции и использовать с псевдонимом в функции. В ES6 есть новый arrow syntax function, Arrow functions не отменяйте this, В твоем случае

run () {

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

this в run function и в parameter function подобные. Это означает, что в arrow function scope this относится к этому this в котором arrow function был определен.

В случае эффективности вам не нужна дополнительная переменная. Вы не загрязняете локальную область видимости дополнительной переменной. На исполнение это никак не влияет.

Другие вопросы по тегам