JSLint错误:意外的“这个”

无法理解为什么JSLint会在下面的代码中使用this一点而感到惊讶:

 function testConstr (x) { 'use strict'; this.joker = "Whyyy sooo seriousss?"; this.x = x; } 

对于这两个财产分配,JSLint说: 意想不到的'这'。 我如何纠正我的代码?

你的代码可能是完全正确的(这也可能是有问题的,这取决于你如何调用testConstr )。

我的build议是:告诉JSLint闭嘴

在这里输入图像说明

或根本不使用JSLint。

换句话说,JSLint不会自动期望我使用构造函数模式?

你知道,我认为你是对的。 你的问题困扰了我,我注册了Crockford的JSLint讨论组,并询问 。 他回答说,但忽略了我要提出的解决scheme,下面我想这意味着没问题,就像JSLint没有抱怨,如果通过的话。

(尽pipe如此,我还在等待更新的Good Parts 。)

抛开这个警告,这里是我build议为通过Beta JSLint的OO JavaScript(至今为止)做的事情。

我将从MDN的页面“ 面向对象编程入门 ”中重写一个例子,它自己使用this

有了this

以上是链接部分的原始MDL示例:

 var Person = function (firstName) { this.firstName = firstName; }; Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.firstName); }; var person1 = new Person("Alice"); var person2 = new Person("Bob"); // call the Person sayHello method. person1.sayHello(); // logs "Hello, I'm Alice" person2.sayHello(); // logs "Hello, I'm Bob" 

遵循我们所知道和喜爱的惯例。

没有this

要弄清楚如何使“构造函数”不遵循这种模式,但是我们失去了prototype使用,如果我没有遗漏某些东西,并且必须在我们想要的构造函数中包含所有对象的方法我们所有Peep分享。

 /*jslint white:true, devel:true */ var Peep = function(firstName) { "use strict"; var peep = {}; peep.firstName = firstName; peep.innerSayHello = function() { console.log("Hello, I'm " + peep.firstName + "."); }; return peep; }; var peep1 = new Peep("Bob"); var peep2 = new Peep("Doug"); peep1.innerSayHello(); peep2.innerSayHello(); 

所以有一个可供select的方法。 那就是,除了return peep; 和方法的内部定义,使得JavaScript像许多你可能遇到的OO第一语言一样行事。 至less没有

没有获得prototype是不可怕的; 改变prototype地方不是正确的,因为你的代码会去意大利面。 “ 有些Person说了sayGoodbye() ,有些人不这样做,这取决于我们是否在build造时修改了原型。 ”这太可怕了。 所以这个替代惯例有其优点。

当然,你可以将函数添加到一个单一的Peep实例中,但是我不知道如何在不使用this firstName情况下访问firstName ,所以也许他希望我们在构build完成之后不要再使用this

 person1.sayGoodbye = function (other) { console.log("Goodbye, " + other + "."); }; 

(我的意思是,我们也可以在安装过程中改变它,但这是可怕的,愚蠢的编程。

inheritance(没有this

我认为,inheritance是很容易的。

 var PeepWithGoodbye = function (firstName) { "use strict"; var peepWithGoodbye = new Peep(firstName); peepWithGoodbye.innerSayGoodbye = function (otherPeep) { if (undefined === otherPeep) { otherPeep = { firstName: "you" }; } console.log("This is " + firstName + " saying goodbye to " + otherPeep.firstName + "."); }; return peepWithGoodbye; }; var pwg1 = new PeepWithGoodbye("Fred"); pwg1.innerSayHello(); // Hello, I'm Fred. pwg1.innerSayGoodbye(peep1); // This is Fred saying goodbye to Bob. pwg1.innerSayGoodbye(); // This is Fred saying goodbye to you. 

编辑:另请参见这个答案 ,提问者后来发现克罗克福德build议创build面向对象的JavaScript的手段。 我试图说服那个人删除那个问答,并把A移到这里。 如果他没有,我可能会在这里添加他的东西和社区wiki。


编辑: 从MDN看它为什么工作:

(通常构造函数不返回值,但是如果他们想要覆盖正常的对象创build过程,他们可以select这样做。)

 'use strict'; var SudoConstructor = (function () { /* We need bind, < IE9 needs a (tiny) polyfill */ function protoEsqDeclare(sudoThis) { return sudoThis; } function protoEsqSet(sudoThis, newValA, newValB) { sudoThis.valA = newValA; sudoThis.valB = newValB; } function instanceCreator(valA, valB) { var sudoThis = { valA: valA, valB: valB }; return { declare: protoEsqDeclare.bind(null, sudoThis), set: protoEsqSet.bind(null, sudoThis) }; } return instanceCreator; }()); 

在严格模式下, this引用被设置为undefined

所以你的语句都会导致undefined对象的读取属性,这将导致exception。

我如何纠正我的代码?

删除这两行。

UPD:我上面说的是JSLint如何处理你的代码,而不是我怎么做。

JSLint说:意外的“这个”。 我如何纠正我的代码?

没有必要更正您的代码。

在JSLint的帮助页面的/*jslint*/指令部分中,“ Tolerate this ”选项已添加到可用选项的表格中:

 +---------------+------+---------------------------------+ | Tolerate this | this | true if this should be allowed. | +---------------+------+---------------------------------+ 

因此,要抑制有关使用this抱怨,请在第一条语句之前将以下指令放入源文件中:

 /*jslint this */ 

(请注意,其他/*jslint*/ options可能会在选项之间插入逗号,请参阅JSLint帮助页面。)

另请参阅@Oriol的答案,在JSLint的用户界面中启用 Tolerate this选项。