JSLint 错误'new function(){...}'但为什么呢?如果我想要匿名关闭,有没有更好的方法?



我正在尝试骨干并玩模型概念 - 我过去在没有框架的情况下实现过。我也在尝试打开 javascript linter 的崇高文本,并注意到它非常讨厌"新"。

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"调用将在顶部,使其更明显地成为匿名构造函数。

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;
        }
    };
}()));

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/

它应该工作得很好,但 crockford 坚持要求您将自调用匿名函数的call移动到定义函数的括号内。
例如,当我使用 jslint 验证此代码时:

(function () { })();

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

(function () { }());

它不再喊错误了。

附言这真的无关紧要,因为结果是一样的(当然我不知道 ie6<),但我总是使用第一种方法来自调用函数。

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

相关内容