Set*_*r22 5 javascript jslint this
考虑这个简单的例子:
"use strict";
var Foo = {
field: 0,
func: function () {
this.field = 4;
}
}
Run Code Online (Sandbox Code Playgroud)
JSLint抛出错误:
出乎意料的'这个'.在"this.field = 4"行.
我在StackOverflow中似乎有一些问题要求这一点,在所有情况下,答案只是启用"容忍这个"标志.但是,我很感兴趣为什么JSLint创建者认为使用"this"是(或可能导致)错误.
另外,如何在没有"this"关键字的情况下实现成员函数,而不期望用户将实例作为第一个参数传递?
编辑也许我没有让自己明确这个问题,尽管看起来类似,但我没有回答我的问题:JSLint错误:意外'这个'
这个问题的问题不在于问题本身,而在于它得到的答案.请注意接受的答案是:"我的建议是:告诉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
});
}
Run Code Online (Sandbox Code Playgroud)
据我了解,“模式”是避免使用“this”和任何其他对象创建方式(通过 new 或 Object.create),同时摆脱原型继承。
此时,构造函数现在是一个返回对象的函数(在本例中是冻结的,但实际上没有必要)。
所有“面向对象”的东西都是通过将成员和方法存储在构造函数的闭包中来实现的,并且成员函数可以通过名称引用它们,因为它们存在于当前作用域中。这成功地避免了“this”的使用。
可悲的是,我从中得到的真正答案是,在 JavaScript 中创建对象有很多复杂的方法,而且在我看来,每种方法都有其缺陷。JSLint 是一个很好的工具,但没有人应该在没有进行一些研究并理解为什么会出现这些错误的情况下遵循它。尤其是在没有提供真实、全面的理由的情况下。连作者也没有。