如果你在Youtube上观看足够多的道格拉斯·克罗克福德视频,你会发现要获得一个外部this
他做的事情
var that = this;
$('p').each(function(){
that._textPieces.push($(this).text());
});
这就是为什么我这样做的原因。然而,我知道有些JS开发人员认为这是伪劣的,而是使用bind
以及使用更多语言功能的所有其他方式,但却使代码更难以阅读,因为读者必须去做更多工作才能找出{{1} 1}}表示在使用它的确切上下文中。
答案 0 :(得分:1)
首先:正如几位评论者所指出的那样,在ES5中使用.bind()
和在ES6中使用arrow functions通常更受青睐。
在.bind()
之前曾经有一个黑暗时代,the compatibility table at the bottom of this MDN page证明了这一点;克罗克福德就是那个年纪的人。正如您从.bind()
polyfill(也在MDN页面上)中看到的那样,与简单{{1}相比,滚动您自己的完全标准正确的 .bind()
并非易事。 - 所以做后者并不是没有道理的。
当然,我不是克罗克福德,所以我不知道他的思维过程是什么时候回来了:))
考虑到这一点,这个技巧偶尔会派上用场。例如,d3具有var that = this;
函数,该函数针对选择中的每个元素调用,该元素绑定到selection.each()
。外部作用域中的this
允许我访问元素和外部作用域var that = this;
:
this
(这个特殊的例子来自一些代码,其中我没有想要两次调用var that = this;
d3.selectAll('circle.foo')
.each(function(d, i) {
var circle = d3.select(this);
var position = that.computePosition(circle);
circle
.attr('cx', position.x)
.attr('cy', position.y);
});
,因为有足够的computePosition()
DOM节点,分析显示circle.foo
到是一个瓶颈。您可以想象jQuery和其他类似DOM操作库中的类似场景。)
就个人而言,我通常会将computePosition()
与that
(例如this
,context
,outerContext
等视觉上的内容区别开来,以尽量减少混乱。