考虑这个简单的例子:
"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是一个很好的工具,但是如果没有做一些研究并理解为什么会出现这些错误,就不应该使用它。尤其是在没有提供真实、全面的理由的情况下。