无法理解为什么JSLint对我在以下代码中使用this
感到惊讶:
function testConstr (x) {
'use strict';
this.joker = "Whyyy sooo seriousss?";
this.x = x;
}
对于这两个属性赋值,JSLint说:意外'this'。如何更正我的代码?
答案 0 :(得分:29)
您的代码可能完全正确(也可能会出现问题,具体取决于您调用testConstr
的方式)。
我的建议是:告诉JSLint关闭
或者根本不使用JSLint。
答案 1 :(得分:27)
So in other words, JSLint doesn't automatically expect me to use a constructor pattern?
你知道,我认为你是对的。您的问题困扰着我,我注册了Crockford's JSLint discussion group和asked。他回答说,但是忽略了我要在下面提出的解决方案,我认为意味着它没关系,就像JSLint在没有通过的情况下不会抱怨一样鼓起。
(我还在等待更新的 Good Parts 。)
除了这个警告之外,这里是我建议通过Beta JSLint的OO JavaScript(截至今天,无论如何)。
我要从MDN的页面重写一个例子," Introduction to Object Oriented Programming,"它自己使用this
。
this
以上是链接部分中的原始 unlinted MDN示例:
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();
所以这是一个可以替代的选择。除了return peep;
和方法的内部定义之外,这样做可以使JavaScript像您可能遇到的许多OO优先语言一样。它至少不是错误的。
无法访问prototype
并不可怕;将prototype
更改为构造函数旁边的某个地方真的是个坏消息,因为你的代码会转到意大利面。 " 有些Person
有sayGoodbye()
而有些{0}},这取决于我们是否在构建时修改了原型。 "太可怕了。所以这种替代惯例有其优点。
当然,您仍可以在以后Peep
的单个实例中添加功能,但我不确定如何在不使用{{1}的情况下访问firstName
所以也许他希望我们在施工后停止翻修物体。
this
(我的意思是,我们还可以通过猴子补丁person1.sayGoodbye = function (other) {
console.log("Goodbye, " + other + ".");
};
来改变它的中间过程,但这是一个可怕的,愚蠢的编程。通常。)
Peep
)我认为继承很容易。
this
编辑:另请参阅this answer,其中提问者后来发现了Crockford建议的创建OO javascript的方法。我试图说服那个人删除Q& A并将A移到这里。如果他没有,我可能会在这里添加他的东西和社区维基。
编辑:请参阅this from MDN了解其工作原理:
(通常情况下,施工人员不会返回值,但他们可以选择这样做 所以,如果他们想要覆盖正常的对象创建过程。)
答案 2 :(得分:3)
registry.addInterceptor(new MyHandlerInterceptor().addPathPatterns("/**"));
答案 3 :(得分:2)
在严格模式下,this
引用设置为undefined
。
因此,您的两个语句都将导致undefined
对象的读取属性,这将导致异常。
如何更正我的代码?
删除这两行。
UPD:我上面说的是JSLint如何处理你的代码,而不是我如何处理你的代码。
答案 4 :(得分:1)
JSLint说:意外'这个'。如何更正我的代码?
无需更正您的代码。
在help page for JSLint的 /*jslint*/
指令部分中," 容忍this
&# 34;选项已添加到可用选项表中:
+---------------+------+---------------------------------+
| Tolerate this | this | true if this should be allowed. |
+---------------+------+---------------------------------+
因此,为了抑制有关使用this
的投诉,请在第一个语句之前将以下指令放入源文件中:
/*jslint
this
*/
(请注意,通过在选项之间插入逗号,其他 /*jslint*/
选项可能会跟随this
。请参阅JSLint帮助页面。)
另请参阅the answer by @Oriol以在JSLint的用户界面中启用" Tolerate this
" 选项。
答案 5 :(得分:0)
我知道一个老问题,但如果它对任何人都有帮助,我正在观看道格拉斯·克罗克福德(Douglas Crockford)的talk,他说(大约23分钟)他将其删除,因为攻击者可以使用以下方法函数,并使用'this'关键字访问全局范围。
他说这也意味着不再使用Object.create了-他帮助该语言引入了一项功能!