为什么要用 this

如果对于那些老练的 JavaScript 开发者来说 this 机制都是如此的令人费解,那么有人会问为什么这种机制会有用?它带来的麻烦不是比好处多吗?在讲解 如何 有用之前,我们应当先来看看 为什么 有用。

让我们试着展示一下 this 的动机和用途:

  1. function identify() {
  2. return this.name.toUpperCase();
  3. }
  4. function speak() {
  5. var greeting = "Hello, I'm " + identify.call( this );
  6. console.log( greeting );
  7. }
  8. var me = {
  9. name: "Kyle"
  10. };
  11. var you = {
  12. name: "Reader"
  13. };
  14. identify.call( me ); // KYLE
  15. identify.call( you ); // READER
  16. speak.call( me ); // Hello, I'm KYLE
  17. speak.call( you ); // Hello, I'm READER

如果这个代码段 如何 工作让你困惑,不要担心!我们很快就会讲解它。只是简要地将这些问题放在旁边,以便于我们可以更清晰的探究 为什么

这个代码片段允许 identify()speak() 函数对多个 环境 对象(meyou)进行复用,而不是针对每个对象定义函数的分离版本。

与使用 this 相反地,你可以明确地将环境对象传递给 identify()speak()

  1. function identify(context) {
  2. return context.name.toUpperCase();
  3. }
  4. function speak(context) {
  5. var greeting = "Hello, I'm " + identify( context );
  6. console.log( greeting );
  7. }
  8. identify( you ); // READER
  9. speak( me ); // Hello, I'm KYLE

然而,this 机制提供了更优雅的方式来隐含地“传递”一个对象引用,导致更加干净的API设计和更容易的复用。

你的使用模式越复杂,你就会越清晰地看到:将执行环境作为一个明确参数传递,通常比传递 this 执行环境要乱。当我们探索对象和原型时,你将会看到一组可以自动引用恰当执行环境对象的函数是多么有用。