我正在尝试骨干并玩模型概念 - 我过去在没有框架的情况下实现过。我也在尝试打开 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
。