为什么JSLint禁止“this”关键字?

时间:2015-08-08 10:01:10

标签: javascript this jslint

考虑这个简单的例子:

thread_local

JSLint抛出错误:

  

意外'这个'。在“this.field = 4”行。

我在StackOverflow中似乎有一些问题需要这个,在所有情况下,答案只是启用“容忍这个”标志。但是,我很感兴趣为什么JSLint创建者认为使用“this”是(或可能导致)错误。

另外,如何在没有“this”关键字的情况下实现成员函数,而不期望用户将实例作为第一个参数传递?

编辑也许我没有说清楚这个问题,尽管看起来很相似但我没有回答我的问题:JSLint Error: Unexpected 'this'

这个问题的问题不是问题本身,而是它得到的答案。请注意接受的答案是:“我的建议是:告诉JSLint关闭”。我在帖子中特别说这对我来说不是一个有效的答案,因为我想理解为什么JSLint禁止使用这个,而不是如何避免这个错误。

1 个答案:

答案 0 :(得分:2)

正如@pdenes在评论中所指出的,这里有一些关于这个主题的讨论:https://plus.google.com/communities/104441363299760713736/s/Berriman%20new%20version%20fails

还有Douglas Crockford youtube talk called "The Better Parts"道格拉斯在其中公开了他的一些观点,并提出(在他看来)制作构造函数的更好方法。

建议的构造函数模式看起来像这样(直接取自他的演讲,它也说明了ES6的一些特性):

function constructor(specs) {
    let {member} = spec, 
        {other} = other_constructor(spec),
        method = function() {

        };
    return Object.freeze({
        method,
        other
    });
}

"模式",据我所知,是为了避免使用"这个"和任何其他对象创建方式(通过new或Object.create),也可以摆脱原型继承。

此时,构造函数现在是一个返回一个对象的函数(在这种情况下,冻结了,但实际上并不需要它)。

所有"面向对象"通过将构件和方法存储在构造函数的闭包中来实现填充,并且成员函数可以通过名称来引用它们,因为它们存在于当前范围中。这成功地避免了使用"这个"。

可悲的是,我从中得到的真正答案是,有很多复杂的方法可以在javascript中创建一个对象,而IMO每个都有它的缺陷。 JSLint是一个很好的工具,但没有人应该遵循它而不做一些研究并理解为什么会给出这些错误。特别是当没有提供真实,全面的理由时。甚至没有作者。