js:为何使用 self = this

59 阅读2分钟
  • 保持 this 的引用: 在 JavaScript 中,this 的值在不同上下文中会发生变化。特别是在回调函数或者异步操作中,this 可能会指向全局对象或者其他对象。通过 self = this,可以在闭包中保存当前 publish 函数执行时的 this 值,确保在后续的代码中,仍然能够正确地访问到 Meteor 对象。

  • 避免 this 丢失: 当你在 publish 函数中使用嵌套函数或者回调函数时,this 的值可能会发生变化。例如:

Meteor.publish("myPublication", function () {
  this.ready(); // 这里的 this 指向 Meteor 对象

  setTimeout(function () {
    this.ready(); // 这里的 this 指向全局对象 (window 或 global)
  }, 1000);
});

为了避免这种 this 丢失的情况,使用 self 可以在嵌套函数中保持对 Meteor 对象的引用。

  • 代码可读性: self 作为一个约定俗成的命名,可以明确表示它保存的是当前对象的引用,提高代码可读性。

为何不能直接使用 this

publish 函数的大部分场景中,直接使用 this 是可以的。但是,在以下情况下,直接使用 this 会出现问题:

  1. 嵌套函数: 如上例所示,在嵌套函数中,this 会指向全局对象,而不是 Meteor 对象。
  2. ES6 箭头函数: 箭头函数没有自己的 this 绑定,它的 this 值会继承自外层作用域。因此,在箭头函数中直接使用 this 可能无法正确引用 Meteor 对象。

总结:

  • self = this 是为了在闭包中保存 this 的引用,确保在后续代码中能够正确访问 Meteor 对象。
  • publish 函数的大部分场景中,可以直接使用 this,但在嵌套函数或箭头函数中,应该使用 self 来保证正确性。
  • 使用 self 也可以提高代码可读性。