为什么 JSLint 禁止 "this" 关键字?

Why does JSLint forbid the "this" keyword?

考虑这个简单的例子:

"use strict";
var Foo = {
    field: 0,
    func: function () {
        this.field = 4;
    }
}

JSLint 抛出错误:

Unexpected 'this'. At the line "this.field = 4".

我在 Whosebug 中似乎遇到了一些问题,在所有情况下,答案只是启用 "Tolerate this" 标志。但是,我感兴趣的是为什么 JSLint 的创建者认为 "this" 的使用是(或可能导致)错误。

此外,如果没有 "this" 关键字并且不期望用户将实例作为第一个参数传递,我将如何实现成员函数?

编辑 也许我在这个问题上不够清楚,尽管看起来很相似但没有回答我的问题:

这个问题的问题不在于问题本身,而在于它得到的答案。请注意接受的答案是:"My suggestion is: tell JSLint to shut up"。我在 post 中特别指出,这对我来说不是一个有效的答案,因为我想了解为什么 JSLint 禁止使用它,而不是如何避免该错误。

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

还有一篇 Douglas Crockford youtube talk called "The Better Parts",其中 Douglas 公开了他对此的一些看法,并提出了一种(在他看来)更好的构造函数的方法。

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

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

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

"pattern",据我理解,是为了避免使用"this"和任何其他创建对象的方式(通过new,或Object.create),也摆脱了原型继承。

此时,构造函数现在是一个 returns 对象的函数(在本例中,冻结,但实际上不需要)。

所有 "object-oriented" 的东西都是通过将成员和方法存储在构造函数的闭包中来实现的,成员​​函数可以通过名称引用它们,因为它们存在于当前作用域中。这成功地避免了使用 "this".

可悲的是,我从中得到的真正答案是,在 javascript 中创建对象的方法有很多种,而 IMO 中的每一种方法都有其缺陷。 JSLint 是一个很好的工具,但没有人应该在没有做一些研究和理解为什么会出现这些错误的情况下使用它。尤其是当没有提供真实、全面的理由时。连作者都没有。