4

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

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 批准?我在这里缺少什么吗?这是什么原因?我可以“退还这个;” 在我所有的模型定义中,但这看起来很愚蠢,而且不直观 - 模型定义可能不止一个屏幕长,并且“新”调用将位于顶部,使其更明显是一个匿名构造函数。

4

4 回答 4

4
Backbone.Model.extend(new function(){
    var x;
    this.value = "";
    this.func = function() {
        return x;
    };
});

可以替换为:

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;
        }
    };
}()));
于 2012-06-08T18:23:46.047 回答
2

JSLint 不喜欢new anonFn.

你可以这样做:

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:http: //jsfiddle.net/maniator/Ztycf/

于 2012-06-08T18:05:53.753 回答
1

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

(function () { })();

它给了我这个错误: 将调用移动到包含函数的括号中。
在我这样修改代码后:

(function () { }());

它不再大喊错误。

ps 这真的没关系,因为结果是一样的(当然我不知道 ie6<),但我总是使用第一种方法进行自调用函数。

于 2012-06-08T18:13:24.343 回答
0

如果您实际上通过 jslint 运行该代码,则提到的错误是Weird construction. Delete 'new'. new function在 javascript 中创建匿名函数时不需要指定。

于 2012-06-08T18:11:20.723 回答