JSLint错误:意外'这个'

时间:2015-05-19 00:38:11

标签: javascript constructor jslint

无法理解为什么JSLint对我在以下代码中使用this感到惊讶:

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

对于这两个属性赋值,JSLint说:意外'this'。如何更正我的代码?

6 个答案:

答案 0 :(得分:29)

您的代码可能完全正确(也可能会出现问题,具体取决于您调用testConstr的方式)。

我的建议是:告诉JSLint关闭

enter image description here

或者根本不使用JSLint。

答案 1 :(得分:27)

  

So in other words, JSLint doesn't automatically expect me to use a constructor pattern?

你知道,我认为你是对的。您的问题困扰着我,我注册了Crockford's JSLint discussion groupasked。他回答说,但是忽略了我要在下面提出的解决方案,我认为意味着它没关系,就像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更改为构造函数旁边的某个地方真的是个坏消息,因为你的代码会转到意大利面。 " 有些PersonsayGoodbye()而有些{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了-他帮助该语言引入了一项功能!