「私が理解している限りでは、この関数はグローバル スコープを持っていますよね?」
「スコープ」とは、関数がアクセスできる変数 (つまり、それ自体のローカル変数、ネストされている可能性のある関数で宣言されたローカル変数、およびグローバル変数) に関するものであり、 の値とは関係ありませんthis
。スコープは関数宣言の場所によって異なりますがthis
、関数の呼び出し方法によって異なります。
「以来 、このクロージャーにオブジェクトを.call(this)
渡しています」 window
示されているコードだけでは、それを伝えることはできません。おそらく、そのコードのブロックが他の関数内にネストされていないことを意味しているので、はいthis
、window
. しかし、そのコードが他の関数内に貼り付けられた場合、そのthis
関数が呼び出された方法に応じて、他の値を持つ可能性があります。
「変える .call(this)
だけで ()
何か変わるの?」
それだけを使用する()
と、関数内はthis
になりますwindow
。それが何かを変えるかどうかは、this
in.call(this)
がwindow
最初にあったかどうかに依存します - すでに上で述べたように、そのブロックが他の関数内にネストされている場合、this
何か他のものになる可能性があります。そうthis
はwindow
言っても、示されているコードについては、コードが壊れると思います。次のような関数を宣言するためです。
this.deleteKeyword = function(model) {...}
...そして、2番目のクリックハンドラー内で、使用せずthis
に同じ関数であると想定しているものを呼び出します:
deleteKeyword($(this));
機能する唯一の方法は ifthis
でwindow
あり、deleteKeyword()
関数はしたがってグローバルです。他のオブジェクトの場合this
、関数はその他のオブジェクトのプロパティになるため、 として直接アクセスすることはできませんdeleteKeyword()
。ただし、表示されていない他のコードから特にアクセスできるようにしたい場合を除きdeleteKeyword()
、プロパティとして作成する理由はまったくありませんthis
。で宣言するだけvar
です:
var deleteKeyword = function(...
...そして、その関数内と、クリックハンドラーなどのネストされた関数内でのみアクセスできます。また、.call()
関数が実際に を使用することはないため、関数の最後の は冗長になりますthis
。
「では、パフォーマンスを向上させるために jQuery オブジェクト (または単に空のオブジェクト) を適用するのがより良いオプションではないでしょうか?これがローカル スコープを指している場合、パフォーマンスは向上しませんか? window オブジェクトは非常に遅いためです。」
すでに述べたように、「スコープ」と値this
は無関係な概念です。そのコードのパフォーマンスについて心配している理由がわかりません。しかし、jQuery または空のオブジェクトを.call(jQuery)
orで適用すると.call({})
、コードは上記のように機能しません。