4

私はバックボーンを試し、モデルの概念で遊んでいます。これは、過去にフレームワークなしで実装したものです。また、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承認を受けるには、この非常に冗長な方法を使用する必要がありますか?ここに欠けているものはありますか?これの理由は何ですか?私は「これを返す」ことができました。私のすべてのモデル定義では、それはばかげているように見え、直感的ではありません。モデル定義は1画面以上の長さであり、「新しい」呼び出しが一番上にあり、より明らかに匿名のコンストラクターになります。

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

このエラーが発生します: 呼び出しを関数を含むparensに移動します。
このようにコードを変更した後:

(function () { }());

もうエラーを叫ぶことはありません。

ps結果は同じであるため(もちろん、ie6 <についてはわかりません)、実際にはそれほど重要ではありませんが、自己呼び出し関数には常に最初の方法を使用します。

于 2012-06-08T18:13:24.343 に答える
0

実際にそのコードをjslintで実行すると、前述のエラーはですWeird construction. Delete 'new'new functionjavascriptで無名関数を作成するときに指定する必要はありません。

于 2012-06-08T18:11:20.723 に答える