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



考虑这个简单的例子:

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

意想不到的"这"。在这一行。

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

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

EDIT也许我在这个问题上没有让自己足够清楚,尽管看起来很相似,但我问的问题没有答案:JSLint Error: Unexpected 'this'

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

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

还有一个叫Douglas Crockford的youtube演讲叫做"The Better Parts",在这个演讲中Douglas暴露了他对这个问题的一些看法,并提出了一个(在他看来)更好的构造函数的方法。

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

function constructor(specs) {
    let {member} = spec, 
        {other} = other_constructor(spec),
        method = function() {
        };
    return Object.freeze({
        method,
        other
    });
}

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

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

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

遗憾的是,我从中得到的真正答案是,在javascript中创建对象有许多令人费解的方法,在我看来,每种方法都有其缺陷。JSLint是一个很好的工具,但是如果没有做一些研究并理解为什么会出现这些错误,就不应该使用它。尤其是在没有提供真实、全面的理由的情况下。

相关内容

最新更新