0

jQuery 1.7 を使用しています。名前空間がどのように機能するかを把握しようとしています。の一部を機能させることはできますが、完全に機能するとは限りません。フォーム要素が入力されると、関数 checkPasswordForm が起動し、フィールドの値を警告することを期待しています。

このフォーム要素があります。

<input type='text' id='Password'>

このコードは、名前空間を作成し、オブジェクトを作成し、関数を作成することを期待しています。

// SET NAMESPACE
var nsPASS = {

$Password: $('#Password'),

checkPasswordForm: function() {
    var Password = $Password.val();
    alert(Password);
}

};
nsPASS.$Password.keyup(nsPASS.checkPasswordForm);

ただし、このコードは実行されません。$Password が定義されていないというエラーが表示されます。コードを機能させるために、さまざまな方法でコードを変更しました。以下のバージョンは、期待どおりに動作します。タスクを達成するのに必要以上のコードのようです。

// SET NAMESPACE
var nsPASS = {

$Password: $('#Password'),

init: function() {
    $Password = $('#Password');
},

checkPasswordForm: function() {
    var Password = $Password.val();
    alert(Password);
}

};

nsPASS.init();
nsPASS.$Password.keyup(nsPASS.checkPasswordForm);

2 番目の例で、nsPASS.init() を削除すると、コードが壊れます。Password: $('#Password') を削除すると、コードが壊れます。

オブジェクトを定義してすぐに関数で使用できますか? 最初の例は機能するのに、2 番目の例は機能しないのはなぜですか?

4

2 に答える 2

4

JavaScript には名前空間がなく、オブジェクトのみがあります。オブジェクトのプロパティに何らかの値がある場合、変数のようにプロパティ名を使用するだけではなく、常にオブジェクトを介してアドレス指定する必要があります。

2 番目の例で、nsPASS.init() を削除すると、コードが壊れます。Password: $('#Password') を削除すると、コードが壊れます。

これは、1 つは暗黙的にグローバル変数 (関数で割り当てられ、init関数で使用されるcheckPasswordForm) であり、もう 1 つはオブジェクトのプロパティnsPass(オブジェクト リテラルで初期化され、nsPASS.$Password.keyup(…)呼び出しで使用される) であるためです。だからそれを

var Password = nsPass.$Password.val();

名前空間オブジェクトのコンテキストで (メソッドとして) 常に呼び出される関数を作成している場合は、thisキーワードをオブジェクトへの参照として使用できます。ただし、特定の関数はイベント ハンドラーとして呼び出されるため、そのコンテキストは#Password入力そのものです。に簡単に変更できます。

var Password = $(this).val(); // or shorter: this.value;
于 2013-03-07T20:35:29.553 に答える
2

使用したコードの最初のブロックに戻ります。これを使用する必要があります:

var Password = nsPASS.$Password.val();

それがそのようなオブジェクトの場合です。変数を探す場所を常に指定することを覚えておく必要があります;)

于 2013-03-07T20:33:22.923 に答える