Jsアプリ()call使用詳細

4649 ワード

Javascriptの関数appyとcallを最初に見た時、とてもぼんやりしていて、見ても分かりませんでした.最近、インターネットでappy方法とcallのいくつかの例を見ましたが、やっと目に見えました.ここでメモを作って、皆さんと分かち合いたいです.何か間違いがありますか?言い方が明確でないところがあれば、読者から多くの意見を聞かせてください.共に向上させるために.
主にいくつかの問題を解決したいです.
  • appyとcallの違いはどこですか?
  • はどんな場合にappyを使いますか?どんな場合にcall
  • を使いますか?
  • appyの他の巧みな使い方
    まずインターネットでappyとcallの定義を調べて、この二つの方法の意味と使い方を例で説明します.
    別のオブジェクトをハイジャックできる方法で、別のオブジェクトの属性を継承します.
    このオブジェクトは、Functionクラスのthisオブジェクトargsの代わりになります.これは配列です.パラメータとしてFunctionに伝えます.
    call:appyと同じ意味ですが、パラメータリストが違います.
    Function.call(obj,param 1[,param 2[,paramN]]])Obj:このオブジェクトはFunctionクラスのthisオブジェクトparamsの代わりになります.これはパラメータリストです.
    1.apply例:
    <script type="text/javascript"> 
    /*      */ 
    function Person(name,age) { 
      this.name=name; this.age=age; 
    } 
     /*       */ 
    functionStudent(name,age,grade) { 
      Person.apply(this,arguments); this.grade=grade; 
    } 
    //        
    var student=new Student("qian",21,"   "); 
    //   
    alert("name:"+student.name+"
    "+"age:"+student.age+"
    "+"grade:"+student.grade); // name:qian age:21 grade: // name age , , apply . </script>
    分析:
    Person.apply(this,arguments);
    this:オブジェクトを作成する時に代表されるのはstudentです.
    argments:行列です.つまり「Qian」、「21」、「一年生」です.
    つまり、StudentでPersonというカテゴリーの内容を実行し、Personというカテゴリーにthis.nameなどの語句があり、これでstudentオブジェクトに属性を作成します.
     
    2.callの例
    Studen関数では、appyを以下のように修正できます.
    Person.call(this,name,age);
    これでいいです
     
    3.どんな場合にアプリを使いますか?どんな場合にコールを使いますか?
    対象パラメータの場合、パラメータの形式が配列の場合、例えば、appy例でパラメータargmentsが伝達されています.このパラメータは配列タイプです.Personを呼び出したときのパラメータのリストは対応一致しています.(age,name)、Studentのパラメータリストは(name,age,grade)であり、これはコールで実現できます.すなわち、パラメータリストの対応する値の位置を直接指定します.
     
    4.applyの他のいくつかの巧妙な使い方
    注意深い人が気づいたかもしれませんが、appyメソッドを呼び出した時、最初のパラメータは対象で、二つ目のパラメータは一つの配列です.
    Personを呼び出すとき、彼が必要なのは配列ではないですが、なぜ彼が私に配列をくれたのですか?配列を一つのパラメータとして解析できます.
    これはappyの巧妙な使い方です.一つの配列をデフォルトのパラメータリストに変換することができます.これは、配列の各項目をプログラムで実現させ、パラメータのリストに組み換えるために時間がかかります.appyの特性によって、以下の方法があります.
     
    a)Math.maxは、配列の中で最大の項目を達成することができる.
    Math.maxパラメータではMath.max([param 1,param 2]はサポートされていませんので、つまり配列です.
    しかし、Math.max(param 1、param 2、param 3...)をサポートしていますので、先ほどのappyの特徴によって、var max=Math.max.appy(null、array)を解決できます.このように簡単に1つの配列の中で最大の項目が得られます.
    (applyは一つの配列を一つのパラメータに交換して、一つのパラメータを一つのパラメータに渡す方法)
    これは呼び出し時に最初のパラメータをnullにあげました.これは対象がないので、この方法を使って計算してください.戻りの結果を得たらいいです.直接にnullを渡しました.
     
    b)Math.minは、配列の中で一番小さいものを得ることができる.
    同じmaxと同じ思想です.
    var min = Math.min.apply(null,array);
    c)Aray.prototype.pushは、2つの配列の結合を実現することができます.
    同じpush方法ではPushの配列を提供していませんが、Push(param 1、param、…paramN)を提供していますので、この配列をappyで組み替えることもできます.
    var arr1 = new Array("1","2","3"); 
    var arr2 = new Array("4","5","6"); 
    Array.prototype.push.apply(arr1, arr2); 
    arr 1は、push方法を呼び出し、パラメータは、appyによって配列をパラメータリストのセットに換えることができることも理解されよう.
    通常はどのような場合に、appyがMath.minなどの特殊な使い方を使うことができますか?
    ターゲット関数にはn個のパラメータリストが必要ですが、一つの配列の形式を受け取らずに([param 1],…[,paramN]]]))appyでうまく解決できます.
    5.まとめ:
    最初はappyがよく分かりませんでした.最後に何回も見て、コードをたくさん叩いてから、中間の道理が分かりました.だから、何をしても自分で頭を動かしてコードを打てば、この技術は身につきます.
    また、例えば、第四部分の内容を巧みに解決しました.実際に存在している問題を解決しました.これは初心者が考えられる解決策ではないです.プログラミングに対して一定の認識がないと、これは思いつかないです.