0

私はこのようなコードを持っています:

(function() {
  $(document).ready(function() {
    //event handlers
    $('.project-delete').on('click', function() {
        deleteProject($(this));
    });

    $('.keyword-delete').on('click', function() {
        deleteKeyword($(this));
  });
  this.deleteKeyword = function(model) {
    }
}).call(this);

私は最近JSを学んでいたので、これが良いアプローチであるかどうか興味があります. ウィンドウオブジェクトをこのクロージャーに渡しているので.call(this)、それは最良の選択肢ではないと思いますか? 私が欠けているものはありますか?変更.call(this)するだけで()何かが変わりますか?

編集:ウィンドウオブジェクトをそのクロージャーに渡すだけでいいですか? 空のオブジェクトまたは jQuery オブジェクトだけを渡すほうがよいのではないでしょうか?

4

2 に答える 2

1

「私が理解している限りでは、この関数はグローバル スコープを持っていますよね?」

「スコープ」とは、関数がアクセスできる変数 (つまり、それ自体のローカル変数、ネストされている可能性のある関数で宣言されたローカル変数、およびグローバル変数) に関するものであり、 の値とは関係ありませんthis。スコープは関数宣言の場所によって異なりますがthis、関数の呼び出し方法によって異なります。

「以来 、このクロージャーにオブジェクトを.call(this) 渡しています」 window

示されているコードだけでは、それを伝えることはできません。おそらく、そのコードのブロックが他の関数内にネストされていないことを意味しているので、はいthiswindow. しかし、そのコードが他の関数内に貼り付けられた場合、そのthis関数が呼び出された方法に応じて、他の値を持つ可能性があります。

「変える .call(this) だけで () 何か変わるの?」

それだけを使用する()と、関数内はthisになりますwindow。それが何かを変えるかどうかは、thisin.call(this)window最初にあったかどうかに依存します - すでに上で述べたように、そのブロックが他の関数内にネストされている場合、this何か他のものになる可能性があります。そうthiswindow言っても、示されているコードについては、コードが壊れると思います。次のような関数を宣言するためです。

this.deleteKeyword = function(model) {...}

...そして、2番目のクリックハンドラー内で、使用せずthisに同じ関数であると想定しているものを呼び出します:

deleteKeyword($(this));

機能する唯一の方法は ifthiswindowあり、deleteKeyword()関数はしたがってグローバルです。他のオブジェクトの場合this、関数はその他のオブジェクトのプロパティになるため、 として直接アクセスすることはできませんdeleteKeyword()。ただし、表示されていない他のコードから特にアクセスできるようにしたい場合を除きdeleteKeyword()、プロパティとして作成する理由はまったくありませんthis。で宣言するだけvarです:

var deleteKeyword = function(...

...そして、その関数内と、クリックハンドラーなどのネストされた関数内でのみアクセスできます。また、.call()関数が実際に を使用することはないため、関数の最後の は冗長になりますthis

「では、パフォーマンスを向上させるために jQuery オブジェクト (または単に空のオブジェクト) を適用するのがより良いオプションではないでしょうか?これがローカル スコープを指している場合、パフォーマンスは向上しませんか? window オブジェクトは非常に遅いためです。」

すでに述べたように、「スコープ」と値thisは無関係な概念です。そのコードのパフォーマンスについて心配している理由がわかりません。しかし、jQuery または空のオブジェクトを.call(jQuery)orで適用すると.call({})、コードは上記のように機能しません。

于 2013-11-08T22:34:58.597 に答える