Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Backbone.js_Closures_Jslint - Fatal编程技术网

Javascript '上的JSLint错误;新函数(){…}';但是为什么呢?如果我想要匿名闭包,有更好的方法吗?

Javascript '上的JSLint错误;新函数(){…}';但是为什么呢?如果我想要匿名闭包,有更好的方法吗?,javascript,backbone.js,closures,jslint,Javascript,Backbone.js,Closures,Jslint,我正在尝试主干和玩模型概念——过去我在没有框架的情况下实现了这一概念。我还尝试在启用javascript linter的情况下使用sublime文本,并注意到它非常讨厌“新” var StandardMethod = Backbone.Model.extend({ initialize : function(){ console.log('init'); } }); var LintOk = Backbone.Model.extend((function(){

我正在尝试主干和玩模型概念——过去我在没有框架的情况下实现了这一概念。我还尝试在启用javascript linter的情况下使用sublime文本,并注意到它非常讨厌“新”

var StandardMethod = Backbone.Model.extend({
    initialize : function(){
        console.log('init');
    }
});

var LintOk = Backbone.Model.extend((function(){
    this.initialize = function(){
        console.log('init');
    };
    return this;
})());

var LintHates = Backbone.Model.extend(new function(){
    this.initialize = function(){
        console.log('init');
    };
});
var sm = new StandardMethod();
var lo = new LintOk();
var lh = new LintHates();​
LintOk方法需要在3个不同的位置进行更改,以创建与闭包兼容的函数。如果我想要一些闭包变量,比如:

var NowWithClosures = Backbone.Model.extend(new function(){
    var x = 1;
    this.initialize = function(){
        console.log('init');
    };
    this.AddOneToX = function(){
        x++;
    };
    this.getX = function() {
        return x;
    };
});

var nwc = new NowWithClosures();
nwc.AddOneToX();
console.log(nwc.getX());

为了获得lint批准,我必须使用这个非常详细的方法?这里有我遗漏的东西吗?原因是什么?我可以在我所有的模型定义中“返回这个”;但这看起来很愚蠢,也不直观-模型定义可能不止一个屏幕长,“new”调用将位于顶部,这使得它更明显是一个匿名构造函数。

JSLint做不像做
newanonfn

您只需执行以下操作:

var StandardMethod = Backbone.Model.extend({
    initialize: function() {
        console.log('init');
    }
});

var LintOk = Backbone.Model.extend((function() {
    this.initialize = function() {
        console.log('init');
    };
    return this;
})());
var backbonefn = function() {
    this.initialize = function() {
        console.log('init');
    }
};
var LintHates = Backbone.Model.extend(new backbonefn);
var sm = new StandardMethod();
var lo = new LintOk();
var lh = new LintHates();​

点击这个提琴中的JSLint:

如果您实际上是通过JSLint运行代码,那么提到的错误是
奇怪的构造。删除“新建”
。在javascript中创建匿名函数时,不需要指定
新函数

它应该可以正常工作,但crockford坚持认为,如果函数已定义,则将自调用匿名函数的
调用
移动到括号内。
例如,当我使用jslint验证此代码时:

(function () { })();
它给了我一个错误:将调用移到包含函数的参数中。
在我这样修改代码之后:

(function () { }());
它不再喊错误了

p、 这真的不太重要,因为结果是一样的(当然我不知道ie6) 可替换为:

Backbone.Model.extend(function(){
    var x;

    return {
        value: "",

        func: function(){
            return x;
        }
    };
}())
通过JSLint:

var Backbone;

Backbone.Model.extend((function () {
    "use strict";
    var x;

    return {
        value: "",

        func: function () {
            return x;
        }
    };
}()));

你为什么要这样做,因为你实例化的每个模型都会共享相同的
x
。另外,在你的
LintOK
代码段中,
this
将是全局对象。在某些情况下,我可能希望模型共享相同的x。关于
this
LintOK
版本中的全局对象,这一点很好。全局对象显然不是我想要的!是的,有一个更好的方法:改用。它非常可配置,并且有一个允许设置。请参阅上的
supernew
。该“new”关键字肯定是“super”!谢谢@am-not-I-amYes,我知道它不喜欢“new anonFn”但是我想知道为什么。新的anon函数的实践有什么不好/不好的地方吗?你的方法会让我把模型定义放在文件的底部:对其他开发人员来说更让人困惑!@firelore你知道
new
做什么吗?我想得不够好,所以我会删除注释。
new function
make这是一个新的
对象对象
,而不是我提供的+1函数。我完全同意你的观点。我只能补充一点,
新的
只有在原型中需要构造函数和一些附加函数的情况下才有意义。该函数将在多个实例之间共享。如果在另一方使用新的匿名函数,则result与上一个版本的代码所显示的对象不同。@WillShaver对于“匿名闭包”来说,这不是一个更好或至少足够的方法,您有什么意见吗?你的回答很好-我只是希望能有更多的解释来解释为什么应该避免使用“新”这个词。它慢吗?更难阅读吗?我应该问“为什么”更明确。我没有考虑过像你在这个回答中那样返回对象文字,所以谢谢。@WillShaver我个人认为没有那么糟糕,Crockford的许多规则都太过主观化了,这就是为什么jshint最初被创建的原因。至于Crockford为什么认为它不好,我不知道:P
var Backbone;

Backbone.Model.extend((function () {
    "use strict";
    var x;

    return {
        value: "",

        func: function () {
            return x;
        }
    };
}()));