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
”选项。