【问题标题】:Why does JSLint forbid the "this" keyword?为什么 JSLint 禁止使用“this”关键字?
【发布时间】:2015-10-31 17:40:56
【问题描述】:

考虑这个简单的例子:

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

JSLint 抛出错误:

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

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

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

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

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

【问题讨论】:

  • 请注意,JSLint 不仅禁止可能导致错误的事情。它“强制”你使用特定的编码风格。
  • 我想指出我在我的问题中特别提到它与我“复制”的不同,尽管没有特别引用链接。特别是当我说:“我在 StackOverflow 中似乎有一些问题要求这个,在所有情况下,答案只是启用“容忍这个”标志。我指的是这个问题,等等。请注意,从我的角度来看,该问题中接受的答案是不可接受的,因为禁用错误并不能解释导致错误的原因以及导致错误的原因。
  • @meskobalazs,很高兴知道。尽管如此,我还是很好奇什么是避免“this”的“好”编码风格,以及为什么根据 JSLint 显然正确使用“this”关键字是有缺陷的。
  • 你应该问问 Douglas Crockford :) 也许他在 The Good Parts 中写下了它。
  • 我认为从重复问题中接受的答案根本没有帮助,但是那里还有另一个更详细的答案,它讨论了不同类型的继承。此外,the JSLint help 说:“在语言中使用它会使谈论语言变得更加困难。这就像与 Abbott 和 Costello 进行结对编程。避免使用它。” (但这仍然不能真正解释为什么 ... :-))

标签: javascript this jslint


【解决方案1】:

正如@pdenes 在 cmets 中指出的那样,这里有一些关于该主题的讨论: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
    });
}

据我所知,“模式”是避免使用“this”和任何其他对象创建方式(通过 new 或 Object.create),同时摆脱原型继承。

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

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

可悲的是,我从中得到的真正答案是,在 javascript 中创建对象有很多复杂的方法,而 IMO 每种方法都有其缺陷。 JSLint 是一个不错的工具,但如果不进行一些研究并了解为什么会出现这些错误,任何人都不应遵循它。尤其是在没有提供真实、全面的理由时。甚至作者都没有。

【讨论】:

  • 这是一个很好的答案。在这里接受您自己的答案当然是公平的,因此我们可以将其从 JSLint 未回答池中划掉。实际上,最好删除这个骗子并在另一个问题上发布您的答案。 I answered there 的时候我没看过那个视频。你的回答会很有帮助。我确实理解您正在制作的“避免”和“理解”之间的差异,但帮助每个人了解可能会盲目避免的人很有用。 (就我个人而言,我不明白 JSLint 的答案怎么可能是“不要使用 JSLint”,而且这种情况经常发生。)
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多