Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSLint错误:意外';这';_Javascript_Constructor_Jslint - Fatal编程技术网

Javascript JSLint错误:意外';这';

Javascript JSLint错误:意外';这';,javascript,constructor,jslint,Javascript,Constructor,Jslint,无法理解为什么JSLint对我在以下代码中使用this感到惊讶: 函数testConstr(x){ "严格使用",; this.joker=“Whyyy sooo seriouss?”; 这个.x=x; }在严格模式下此参考设置为未定义 因此,这两条语句都将导致读取未定义的对象的属性,这将导致异常 如何更正代码 拆下这两条线 UPD:我上面说的是JSLint是如何处理代码的,而不是我是如何处理代码的。您的代码可能完全正确(这也可能有问题,取决于您如何调用testConstr) 我的建议是:告诉

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

函数testConstr(x){
"严格使用",;
this.joker=“Whyyy sooo seriouss?”;
这个.x=x;

}
在严格模式下
参考设置为
未定义

因此,这两条语句都将导致读取
未定义的
对象的属性,这将导致异常

如何更正代码

拆下这两条线

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

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

我的建议是:告诉JSLint闭嘴

或者根本不使用JSLint

我想你是对的。你的问题困扰着我,我报名参加了。他回答说,但忽略了我将在下面介绍的解决方案,我认为这意味着没关系,就像JSLint不会抱怨什么东西通过了检查一样

(不过,我仍在等待更新。)

除此之外,我建议对通过Beta JSLint的OO JavaScript执行以下操作(无论如何,从今天开始)

我将重写MDN页面上的一个例子,“,”它本身大量使用了
这个

使用
下面是上面链接部分中的原始未登录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"
这符合我们所知道和喜爱的惯例

没有
很容易找到如何生成不遵循该模式的“构造函数”,但是如果我没有遗漏什么,我们就失去了对原型的使用,并且必须在构造函数中包含所有对象的方法,我们希望所有的
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();
所以有一种可替代的方法。除了
返回的peep之外,它是
和方法的内部定义使JavaScript的行为类似于您可能遇到的许多OO第一语言。至少没有错

无法访问原型并不可怕;将
prototype
更改到不在构造函数旁边的某个地方真是个坏消息,因为您的代码会变成意大利面条。“一些
人有
说再见()
,而有些人没有,这取决于我们是否在构建原型时对原型进行了修改。”这太糟糕了。因此,这一替代性公约有其优点

当然,您以后仍然可以在
Peep
的单个实例化中添加函数,但我不确定您如何在不使用
this
的情况下访问
firstName
,因此他可能希望我们在构建后停止咀嚼对象

person1.sayGoodbye = function (other) { 
    console.log("Goodbye, " + other + "."); 
};
(我的意思是,我们也可以在过程中使用monkey patch
Peep
来更改它,但这通常是可怕的、愚蠢的编程。)

继承(没有此
) 我认为继承很容易

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.
编辑:另请参见提问者后来在何处找到Crockford建议的创建OO javascript的方法。我试图说服那个家伙删除那个问答,把A移到这里。如果他没有,我可能会把他的东西加在这里


编辑:有关其工作原理,请参见:

(通常构造函数不返回值,但他们可以选择返回 因此,如果他们想覆盖正常的对象创建过程。)

JSLint说:这是意想不到的。如何更正代码

不需要更正您的代码

在中,在
/*jslint*/
指令的部分中,已将“容忍
”选项添加到可用选项表中:

+---------------+------+---------------------------------+
|如果允许的话,容忍这一点是正确的|
+---------------+------+---------------------------------+
因此,为了抑制有关使用此
的投诉,请在第一条语句之前将以下指令放入源文件:

/*jslint
这
*/
(请注意,其他
/*jslint*/
选项可以通过在选项之间插入逗号来遵循此
。请参阅jslint帮助页面。)

另请参见在JSLint的用户界面中启用“容忍
此”
选项。

使用严格”;
'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;

}());
var SudoConstructor=(函数(){ /*我们需要绑定,
我知道一个老问题,但为了防止对任何人有所帮助,我在看道格拉斯·克罗克福德(Douglas Crockford)的一篇文章,他在文章中说(大约23分钟)他把它取出来了,因为攻击者可以将方法作为函数运行,并使用“this”关键字访问全局范围


他说,这也意味着不再使用Object.create——这是他帮助介绍给该语言的一项功能

你的
这个
不一定是坏的。
testConstr
是否用作构造函数?你是用
call
还是
apply
来调用它?如果你发现JSLint有太多的任意警告,你一定要查看JSHint。如果你把它大写为
TestConstr
,会发生什么?警告还在吗?@apsillers是的,那也是我的第一步。仍然破产。新的JSLint希望鼓励您完全停止使用
this
。我的意思是,不可否认,范围确实是最令人困惑的问题之一