javascriptのcall applyのアプリケーションシーン


いくつかのjQueryプラグインの中でよく見られますが、calback.call(xxx,xxx)のように、本で紹介されています。callとapply関数は作用領域を変えることができますが、やはりはっきりと理解できません。作用領域を変えるのは主にどんな問題を解決するためですか?このようなコードを読むたびに目まいがして、一気に直線読みから飛び出してしまいます。ちょっと回りくどい感じがします。
callとappyの役割は簡単です。コンテキストを変えて、適用シーンが多すぎます。時々「美しい」ためだけに、次のいくつかは私がよく使うものです。
1.
Object.prototype.toString.call(Obj)
Objのタイプを判断するために使用されます。
argmentsとarrayは似ていますが、彼はArayのshなどの方法がありません。どうすればいいですか?
Aray.prototype.push.call(argments)
3.Javascriptプライベート方法の概念がないので、クローズドで実現したいです。

(function () {
  var Person = function () {
    this.doSomeThing = function () {
      _privateFunction.call(this);
    }
  }

  var _privateFunction = function () {

  }

  window.Person = Person;

}).call(window);

大体この意味です。calbackを使う時、あなたのcalbackの中の文脈が現在の文脈であることを望む時、callやappyを使ってもいいです。何かいいところがありますか?
この時あなたのcalbackの中のthisは現在の文脈を指します。たとえばPersonのような一つのタイプで、彼の方法sayにはcalbackのパラメータがあります。このcalbackが普通の括弧で実行されるなら、このcalbackでpersonを実行する他の方法は、person.otherで実現する必要がありますが、コンテキストを切り替えると、this.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();
});
以上述べましたが、本文の内容は全部です。お好きになってください。