21

jQuery のプラグインに取り組んでいますが、次のJSLintエラーが発生します。

Problem at line 80 character 45: Do not use 'new' for side effects.

(new jQuery.fasterTrim(this, options));

この JSLint エラーや副作用に関する情報を見つけることができませんでしたnew

「副作用に「new」を使用しないでください」についてグーグルを試しました。そして0件の結果が得られました。Bingingでは 2 つの結果が得られますが、どちらも JSLint ソースを参照しているだけです。うまくいけば、この質問はそれを変えます。:-)

更新#1: コンテキストのソースは次のとおりです。

  jQuery.fn.fasterTrim = function(options) {
    return this.each(function() {
      (new jQuery.fasterTrim(this, options));
    });
  };

更新 #2: Starter jQuery プラグイン ジェネレーターをプラグインのテンプレートとして 使用しました。これにはそのコードが含まれています。

4

6 に答える 6

15

JsLint 自体が理由を示します。

コンストラクターは、新しいプレフィックスで使用するように設計された関数です。新しいプレフィックスは、関数のプロトタイプに基づいて新しいオブジェクトを作成し、そのオブジェクトを関数の暗黙の this パラメーターにバインドします。新しいプレフィックスの使用を怠ると、新しいオブジェクトは作成されず、グローバル オブジェクトにバインドされます。これは重大な間違いです。

JSLint は、コンストラクター関数の名前の最初が大文字であるという規則を強制します。JSLint は、新しい接頭辞がない限り、大文字の名前で始まる関数呼び出しを期待しません。JSLint は、名前が最初の大文字で始まらない関数で使用される新しいプレフィックスが表示されることを想定していません。これは newcap オプションで制御できます。

JSLint は、ラッパーが新しい数値、新しい文字列、新しいブール値を形成することを想定していません。

JSLint は、新しいオブジェクトが表示されることを想定していません (代わりに {} を使用してください)。

JSLint は新しい配列を期待していません (代わりに [] を使用してください)。

于 2010-03-04T17:20:17.680 に答える
7

Travis、私はStarterサイトの開発者です。

@Pointy は頭に釘を打ちました。スターター コードがそのように記述されている理由は、新しいオブジェクトが必要であり、その時点でオブジェクトへの参照を保存する必要がないからです。

からコマンドを変更するだけです

(new jQuery.fasterTrim(this, options)); 

var fT = new jQuery.fasterTrim(this, options);

あなたが見つけたように、JSLintを和らげます。

dataスターター プラグインのセットアップは、オブジェクトへの参照を要素のセットに格納する jQuery UI パターンに従います。これが起こっていることです:

  1. 新しいオブジェクトが作成されます (new 経由)
  2. インスタンスは、jQuery の を使用して DOM 要素にアタッチされますdata$(el).data('FasterTrim', this)

返されるオブジェクトは使用されないため、var宣言は行われません。宣言を変更し、出力をクリーンアップして、そのままの状態で JSLint を渡すことを検討します。

もう少し背景

を使用してオブジェクトを保存する利点dataは、後で呼び出すことでいつでもオブジェクトにアクセスできることです$("#your_selector").data('FasterTrim')。ただし、プラグインに途中でアクセスする必要がない場合 (つまり、1 回の呼び出しで設定され、今後の操作が提供されない場合)、参照を保存する必要はありません。

さらに情報が必要な場合はお知らせください。

于 2010-03-04T20:57:14.040 に答える
6

newオブジェクトを作成して返すのではなく、何らかのアクションを実行するために使用しています。JSLint は、これを の無効な使用と見なしますnew

次のように使用する必要があります。

var x = new SomeConstructor();

または、次のようなアクションを実行します。

SomeMethod();

ただし、次のようなアクションを実行するために new を使用しないでください。

new SomeCosntructor(args);

newこれは、オブジェクトの作成に使用していないため、副作用の使用と見なされます。

于 2010-03-04T17:18:15.283 に答える
6

「new」を呼び出しているが、返されたオブジェクトを破棄しているため、不平を言っているに違いありません。そのコードが「new」を使用しているのはなぜですか?言い換えれば、なぜそれだけではないのですか

jQuery.fasterTrim(this, options);

編集OK、まあ、その「スターター」ツールはそのようにコードを生成します。なぜなら、それは本当に新しいオブジェクトを作成したいからです。そうです、それは本当に副作用を利用することです。「スターター」が生成するコンストラクター コードは、jQuery の「データ」機能を使用して、影響を受ける要素の新しいオブジェクトへの参照を隠します。

于 2010-03-04T17:17:34.893 に答える
2

基本的に JavaScript は処理が遅い傾向があるため、関数を呼び出すためだけに新しいオブジェクトを作成するのは非常に非効率的です。とにかく関数は静的です。

$.fasterTrim(this, options);
于 2010-03-04T17:18:17.830 に答える
0

jQueryのfasterTrimソースコードから:

 * Usage: 
 * 
 * $(element).fasterTrim(options);  // returns jQuery object
 * $.fasterTrim.trim(" string ", options);  // returns trimmed string

質問に答えるには、「副作用に new を使用しないでください」とは、次のことを意味します。

コンストラクターがそのパラメーターに対して行うことのために new を使用しないでください。ただし、オブジェクトを作成するには、コンストラクターの副作用はひどいものです!

于 2010-03-04T17:26:29.180 に答える