var that = this VS dojo.hitch()

var that = this VS dojo.hitch()

使用var that = this;

是否更好
var that = this;
array.forEach( tabPages, function ( tabPage, index ) {
  that.layerTabPageClose(tabPage.id, true);
  ...
});

或改用lang.hitch()

array.forEach( tabPages, lang.hitch( this, function ( tabPage, index ) {
  this.layerTabPageClose(tabPage.id, true);
  ...
}));

哪个更好,为什么?

谢谢

在这个特殊的案例中,两者都不是;使用 Dojo 的 array.forEach 的第三个参数:

array.forEach(tabPages, function ( tabPage, index ) {
  this.layerTabPageClose(tabPage.id, true);
  ...
}, this);
// ^^^^

或者使用浏览器内置的 Array#forEach(从 ES5 开始)及其第二个参数:

tabPages.forEach(function ( tabPage, index ) { // <== Note change
  this.layerTabPageClose(tabPage.id, true);
  ...
}, this);
// ^^^^

一般情况下:

如果您在执行此操作的上下文中创建一个函数(并且您必须这样做,因为 var that = this 是一个选项),这无关紧要并且完全风格问题。

如果你不是,你需要使用lang.hitch或ES5的Function#bind

这实际上是您可以做出的个人选择。如果您更希望能够在任何地方使用上下文,那么您可能应该使用 dojo/_base/lang::hitch(),这样您就可以一直使用 this 上下文。

另一种选择是在(父)作用域上使用额外的变量,例如 thatvm(通常与 AngularJS 一起出现),但两者都很棒。

我唯一的建议是你在整个代码库中做同样的事情。如果您有时使用范围变量,而其他时候使用 lang.hitch(),那么只会导致混淆。


无论如何,某些方法,例如 dojo/_base/array 已经允许您包含上下文:

forEach(arr,callback,thisObject)

API 文档:http://dojotoolkit.org/api/?qs=1.10/dojo/_base/array

所以在这些情况下这是一个更好的解决方案。