4

私は、通常のjsオブジェクトでjQueryオブジェクトを頻繁に使用しています。必要に応じて、スクリプトで.callと.applyをより頻繁に利用する方法を見つけようとしています。私はコードをテストして、実際にどのように機能するかを確認してきました。

ただし、jQueryがあることがわかっているサイトのfirebugで以下のコード(基本的にはページ上のすべてのdivを非表示にするだけ)を実行すると、さまざまな結果が得られます。それがjQueryのバージョンなのか、それともこのコードが「バギー」なのか疑問に思っています。なぜ.callが常に機能するのかを理解する必要がありますが、.applyは、以下のコードに基づいて、その逆になるとは考えていません。

var myApp = {} // instantiate an empty objct
myApp.hide = function (whatever) {
   that = whatever
   $(that).hide()
}
var Numbers = function (object) {
this.object = object;
}

Numbers.prototype.div = $('div');
var numbers = new Numbers();
numbers.div
myApp.hide.call(numbers, numbers.div)
myApp.hide.apply(numbers, numbers.div)

.callまたは.applyを使用して上記のコードをファイアバグすると、サイトによって異なる結果が得られます。jquery .callがあるすべてのサイトは機能しますが、jQuery.comやtwitterなどの一部のサイトでは.applyと.callを使用して機能しますが、NewYorkTimesやNetflixなどの他のサイトでは.callのみが機能します。違いを引き起こしているjQueryですが、numbers.divは常にページ上のすべてのdiv要素の配列を返すため、少し混乱しています。これは常に機能すると思います。私はまだ.callと.applyの概念を理解しているので、どんな説明でもありがたいです-私は常にダグラス・クロックフォードの本を参照していますが、正直なところ、彼は.applyと.callについてあまり詳しく説明していません

4

2 に答える 2

4

.apply引数を配列として渡す必要があります。

それで

myApp.hide.call(numbers, numbers.div)

と同じである必要があります

myApp.hide.apply(numbers, [numbers.div])

ただし、myApp.hide関数には、がないthisため、の最初のパラメーター.callまたは他のパラメーターを指定.applyできます。これは重要ではありません。

于 2012-08-30T05:08:33.353 に答える
2

呼び出し/適用の力は、実際には、呼び出された関数内でこれをどのコンテキストに含めるかによって決まります。最初のパラメータはそれがどうなるかを決定します。これらは、Javascript関数で、関数がいつ/どこで呼び出されるかは問題ではなく、どのように呼び出されるかを示す良い例です。(つまり、あなたのインスタンスでは、これnumbers

どちらも.apply()機能.call()しますが、どちらの2番目のパラメーターも実際にはオプションです。

誰もが言っているように、2つの間の唯一の本当の違いは、引数/パラメーターを配列(連想配列{}ではなく、数値配列[])として渡すかどうかです。

.apply(contextYouWant, [oneParam, twoParam, etc]);

または、のインスタンスでは.call()、パラメータを個別に渡します。

.call(contextYouWant, oneParam, twoParam, etc);

于 2012-08-30T05:18:37.633 に答える