在JavaScript中,应该优先选择哪个关键字——that、self还是me?

19

在编写 JavaScript 代码时,有时您会将对象的引用 this 存储在本地变量中,以便于不同的目的(设置适当的作用域,帮助代码混淆器等)。有些程序员喜欢给 this 取别名为 that,以使其意图明显。另外一些人使用 self,因为它指向对象本身。我甚至看到过源代码中使用 me 来保存引用,并且仍然很有意义。当然还有其他方式。

我应该选择哪一个?是否有规定要使用哪种方法,还是只是品味问题?


1
请注意,编程背景似乎是一个主要因素 - 那些使用(过)Smalltalk或Python,或者从使用它们的人那里学习的人,倾向于使用“self”。 - outis
3个回答

44

个人而言,我使用that,但任何其他清晰易懂的名称都可以。

我不会使用self,因为全局变量/window属性self已经存在作为对window的引用。虽然它完全没用(所以没有人会在意你遮蔽它),但它略微增加了忽视愚蠢错误的风险:

var se1f= this;         // misspelled (perniciously). or maybe you just forgot to write line
onclick= function() {
    self.foo= 1;        // whoops, just wrote to `window`!
};

相比之下:

var that= this;
onclick= function() {
    that.foo= 1;        // error thrown
};

虽然稍微有些牵强,但由于 JavaScript 允许错误存在的宽松性,你不想让它变得更加松散。


另一个错误是在给self赋值时忘记使用var。IE非常讨厌这种情况。 - Crescent Fresh
是啊,好老的IE和它的assign-to-window-property乐趣。不过,至少它会抛出一个错误来让你知道你犯了一个坏习惯。即使错误信息非常误导人。 - bobince

2

你的苹果篮子里有一个橙子,this 在这里有一个非常具体的上下文含义。在这两个选项中,真正的选择是在 selfme 之间。在这两者之间......你可以选择,无论哪种方式都没有关系,只是个人喜好。

this 指的是你所处的上下文,因此如果不引入大量混淆和易于出错的情况,它不是一个“选项”。我看到 self 的使用比 me 更多(例如代码示例、框架、库等)。这只是个人偏好,但我同意 self 更有吸引力,不确定为什么......再次强调,这只是我的个人偏好。


2
我喜欢使用 me,因为少打两个字母... 但只要保持一致性,实际上并不重要。 - Dean Harding
2
@codeka - 很好的观点,一致性比名称的选择更重要 - Nick Craver
2
同意一致性的观点。这可能只是因为选择暴露了程序员对其他语言的经验。self 是 Delphi 版本的 this,而 me 则是 VB 的版本。据我所知,that 在任何其他语言中都没有被使用过。 - MikeJ-UK
6
我知道this是什么意思,我问的是selfme和**that**。 - viam0Zah
2
@Török - 我之前发布了修改后的标题 :) 我建议避免使用 that,至少对于习惯英语的人来说,这会更加令人困惑(因为它在编程以外的自动关联)。如果你的母语不是英语,那么 thisthat 之间的关联就不会干扰,也不会那么令人困惑。 - Nick Craver

1

个人而言,我正在努力让变量的含义更加具体化,而不仅仅是“我以后需要的那个东西”。在某些比较复杂的情况下,你可能需要这些临时变量;可能会有两层或更多层的临时 this 堆栈需要跟踪。

因此,例如在 jQuery 设置中,我可能会使用一些东西来记录一个临时 this 堆栈应该保存的元素类型:

$('form').each(function() {
  var $form = $(this);
  $form.find('input:checkbox').each(function() {
    var $checkbox = $(this);
    // ...
  });
});

在变量前面使用"$"前缀是一种很好的方式,可以方便地追踪对象是否已经进行了jQuery处理,呵呵。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接