一部の jQuery プラグインでは callback.call(xxx,xxx) のようなものをよく見かけますが、call 関数と apply 関数でスコープを変更できると本で読んだのですが、主な目的がまだ完全には理解できません。このようなコードを読むたびに、どのような問題が解決されるのか、代替手段はあるのか、またはこれら 2 つの機能が主に解決することを目的としているのか、それらをいつ使用するのが最適なのかを考えます。めまいがして直線的な読書から飛び出すのは少し複雑な感じです
call と apply の機能は非常にシンプルで、コンテキストを変更するだけです。適用できるシナリオはたくさんありますが、私がよく使用するシナリオは次のとおりです。
1.
Obj のタイプを決定するために使用されます
引数は配列に似ていますが、配列のプッシュメソッドがありません。
Array.prototype.push.call(引数)
3.JavaScriptにはプライベートメソッドの概念がないので、クロージャを使って実装したい
(function () { var Person = function () { this.doSomeThing = function () { _privateFunction.call(this); } } var _privateFunction = function () { } window.Person = Person; }).call(window);
これはほぼ同じことを意味します。コールバックするときに、コールバック内のコンテキストを現在のコンテキストにしたい場合、call または apply を使用することもできます。どのような利点がありますか?
現時点では、コールバック内の this は現在のコンテキストを参照します。たとえば、クラス person とそのメソッドにはコールバック パラメータがあるとします。このコールバックが通常の括弧を通じて実行される場合、このコールバックで実行される person の他のメソッドは person.other を使用して実装する必要がありますが、その後コンテキストが切り替わります。これですべて完了です。other~ コードの比較は次のとおりです:
var Person = function(){ }; Person.prototype.say = function(callback){ callback(); }; Person.prototype.other = function(){ }; var vincent = new Person(); vincent.say(function(){ vincent.other(); });
使用された通話:
var Person = function(){ }; Person.prototype.say = function(callback){ callback.call(this); }; Person.prototype.other = function(){ }; var vincent = new Person(); vincent.say(function(){ this.other(); });
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。