这个JavaScript成语的基础是什么:var self = this?

2022-08-29 23:40:04

我在 WebKit HTML 5 SQL Storage Notes Demo 的源代码中看到了以下内容:

function Note() {
  var self = this;

  var note = document.createElement('div');
  note.className = 'note';
  note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
  note.addEventListener('click', function() { return self.onNoteClick() }, false);
  this.note = note;
  // ...
}

作者在某些地方(函数体)使用self,而在其他地方(在方法的参数列表中定义的函数体)使用self。这是怎么回事?现在我已经注意到它一次了,我会开始到处看到它吗?


答案 1

请参阅有关 alistapart.com 的这篇文章。(编辑:本文自最初链接以来已更新)

self用于维护对原始内容的引用,即使上下文正在更改也是如此。它是一种经常用于事件处理程序(特别是在闭包中)的技术。this

编辑:请注意,现在不建议使用,因为 window.self 存在,如果不小心,可能会导致错误。self

您所说的变量并不特别重要。 很好,但这个名字没有什么神奇之处。var that = this;

在上下文中声明的函数(例如回调,闭包)将有权访问在同一范围或更高范围内声明的变量/函数。

例如,一个简单的事件回调:

function MyConstructor(options) {
  let that = this;

  this.someprop = options.someprop || 'defaultprop';

  document.addEventListener('click', (event) => {
    alert(that.someprop);
  });
}

new MyConstructor({
  someprop: "Hello World"
});

答案 2

我认为变量名称“self”不应该再以这种方式使用,因为现代浏览器提供了一个全局变量self,指向普通窗口或WebWorker的全局对象。

为避免混淆和潜在冲突,可以改为编写 或。var thiz = thisvar that = this