在匿名函数中使用此函数的有效解决方法是什么?

时间:2016-09-01 07:39:31

标签: javascript es6-class

主要关注的是效率。

我正在研究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 个答案:

答案 0 :(得分:2)

是的,它是安全的,但您可以使用新的arrow syntax。它会保留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 functionArrow functions不要覆盖this。在你的情况下

run () {

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

thisrun function中的parameter function是相同的。这意味着在arrow function scope中,this指的是this所定义的arrow function

在有效率的情况下,您不需要额外的变量。您不会使用额外的变量污染本地范围。在表演中没有任何影响。