Douglas Crockford说我们应该使用那个=这个。那么为什么有些JS开发人员不同意呢?

时间:2016-04-19 21:51:48

标签: javascript

如果你在Youtube上观看足够多的道格拉斯·克罗克福德视频,你会发现要获得一个外部this他做的事情

var that = this; 
$('p').each(function(){
    that._textPieces.push($(this).text());
});

这就是为什么我这样做的原因。然而,我知道有些JS开发人员认为这是伪劣的,而是使用bind以及使用更多语言功能的所有其他方式,但却使代码更难以阅读,因为读者必须去做更多工作才能找出{{1} 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(例如thiscontextouterContext等视觉上的内容区别开来,以尽量减少混乱。