JS 의 apply 와 call

<code class="hljs javascript has-numbering">JavaScript   apply call             <span class="hljs-keyword">this</span>   ,         :    <span class="hljs-string">'  '</span>       。
            Web         ,                 ,                   ,      ,     JavaScript       ,          ,          apply call            。
  ,      ,                       。
               :
      ,    <span class="hljs-string">'   '</span>,       ,       。   ,             ,   ,       ?        <span class="hljs-string">" "</span>          ,       ,               ,    ,      ,  <span class="hljs-string">'  '</span> JavaScript     。
       JavaScript      :


<span class="hljs-keyword">var</span> xiaoming = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>,
    makeJuice:<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span>{</span>
        console.log( <span class="hljs-string">'   :'</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">'   '</span> + <span class="hljs-keyword">this</span>.fruit + <span class="hljs-string">' !'</span>);
    }
}
<span class="hljs-keyword">var</span> xiaohong = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>
}
xiaoming.makeJuice( );                 <span class="hljs-comment">//  :   :        !</span>
xiaoming.makeJuice.apply( xiaohong );  <span class="hljs-comment">//  :   :        !</span>

apply            ,  ,               <span class="hljs-keyword">this</span>,           apply   ?     ,             。

     ,             ,    apply       ?           ,        ,      :            。
        apply ?


<span class="hljs-keyword">var</span> xiaoming = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>,
    makeJuice:<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water, time )</span>{</span>
        console.log( <span class="hljs-string">'   :'</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">'   '</span> + <span class="hljs-keyword">this</span>.fruit + <span class="hljs-string">' ,  :'</span> + water + <span class="hljs-string">' mL,  :'</span> + time + <span class="hljs-string">'   。'</span>);
    }
}
<span class="hljs-keyword">var</span> xiaohong = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>
}
<span class="hljs-keyword">var</span> task_info = [ <span class="hljs-number">500</span> , <span class="hljs-number">1</span> ] ;          <span class="hljs-comment">//              </span>
xiaoming.makeJuice.apply( xiaohong , task_info ) ;  <span class="hljs-comment">//  :   :        ,  :500 mL,  :1   。</span>

【  】
   apply         :

 <span class="hljs-number">1</span>    thisObject,        thisObject      <span class="hljs-keyword">this</span>   。
 <span class="hljs-number">2</span>         ,          <span class="hljs-string">"    "</span>。
       ,        :

  :  ,          。
  :   ,               。
              <span class="hljs-string">'      ,     '</span>。
  :  。
          ,   <span class="hljs-string">'  500mL  ,  1   '</span>     <span class="hljs-string">' '</span> ,        ,  <span class="hljs-string">' '</span>         ,      。          <span class="hljs-string">' '</span>     apply                  。

      ,      <span class="hljs-built_in">arguments</span>,      ,                 <span class="hljs-built_in">arguments</span>      。        ,<span class="hljs-built_in">arguments</span>          <span class="hljs-string">'   '</span>(   )。  ,   apply       ,    <span class="hljs-number">2</span>           <span class="hljs-built_in">arguments</span>   <span class="hljs-string">'   '</span>(   ) ?
              ,             ,           ,          ,        ,       。       ,                   ,         。
  ,           ,              。


<span class="hljs-keyword">var</span> wang = {
    name: <span class="hljs-string">'   '</span>,
    helpFromXiaohong: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water , time )</span>{</span>
        <span class="hljs-comment">//         ,           ,  apply      </span>
        <span class="hljs-comment">//                   '    '    ,</span>
        <span class="hljs-comment">//  ,      arguments  </span>
        <span class="hljs-comment">//     ,            ,      </span>
        <span class="hljs-comment">//  ,      :</span>
        xiaoming.makeJuice.apply( xiaohong , <span class="hljs-built_in">arguments</span> ) ;
    }
}
wang.helpFromXiaohong( <span class="hljs-number">400</span> , <span class="hljs-number">2</span> ) ;   <span class="hljs-comment">//        ,           </span>

<span class="hljs-comment">//  :   :        ,  :400 mL,  :2   。</span>

                ,     ,  apply       ,
      <span class="hljs-string">'   '</span>,           <span class="hljs-built_in">arguments</span>     <span class="hljs-number">2</span>   。
<span class="hljs-string">'   '</span>   :

    length  ,<span class="hljs-string">'  '</span>   <span class="hljs-string">'    '</span>。
   <span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>          。
        apply          ,            。              :

<span class="hljs-keyword">var</span> w = <span class="hljs-built_in">Array</span>.prototype.shift.apply( <span class="hljs-built_in">arguments</span> );
                  ,      <span class="hljs-string">'   '</span><span class="hljs-built_in">arguments</span>          ,      w。

【  】

<span class="hljs-number">1.</span>        <span class="hljs-built_in">arguments</span>  shift   ?

  <span class="hljs-built_in">arguments</span>     <span class="hljs-string">'  '</span>, JavaScript       ,<span class="hljs-built_in">arguments</span>       <span class="hljs-string">'    '</span>   。     <span class="hljs-keyword">new</span> <span class="hljs-built_in">Array</span>()     ,          <span class="hljs-string">'Array.prototype'</span>,        shift()  。
<span class="hljs-string">" ,          ,            ?                      。"</span>
    ,              ,  JavaScript     (Douglas Crockfod)      ,         。

<span class="hljs-number">2.</span>     <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">Array</span>.prototype.shift.apply( <span class="hljs-built_in">arguments</span> );      ?

     ,  apply     ,       <span class="hljs-number">1</span>          <span class="hljs-keyword">this</span>。     ,   <span class="hljs-built_in">arguments</span>    (  <span class="hljs-string">'  '</span>       )   <span class="hljs-built_in">Array</span>.prototype.shift  <span class="hljs-keyword">this</span>。

    ,            shift      。
  :

console.log( [<span class="hljs-string">'A'</span>,<span class="hljs-string">'B'</span>,<span class="hljs-string">'C'</span>].shift() ) ; <span class="hljs-comment">//  : A</span>
   [<span class="hljs-string">'A'</span>,<span class="hljs-string">'B'</span>,<span class="hljs-string">'C'</span>].shift()      ,        ,  ,    <span class="hljs-built_in">Array</span>.prototype.shift     ,     <span class="hljs-keyword">this</span>。   <span class="hljs-keyword">this</span>.length    <span class="hljs-keyword">this</span>[<span class="hljs-number">0</span>]               ,

  ,       <span class="hljs-built_in">arguments</span>  <span class="hljs-built_in">arguments</span>.length    <span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>]              ,       <span class="hljs-string">'    '</span> ,  ,    <span class="hljs-built_in">Array</span>.prototype.shift.apply( <span class="hljs-built_in">arguments</span> );        <span class="hljs-number">1</span>    。

    <span class="hljs-string">'   '</span>,                 :


<span class="hljs-keyword">var</span> wang = {
    name: <span class="hljs-string">'   '</span>,
    helpFromXiaohong: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water , time )</span>{</span>
        <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">Array</span>.prototype.shift.apply( <span class="hljs-built_in">arguments</span> );
        console.log( <span class="hljs-string">'      '</span> + w + <span class="hljs-string">' mL   。'</span> );  
        xiaoming.makeJuice.apply( xiaohong , <span class="hljs-built_in">arguments</span> ) ;
        }
    }
   wang.helpFromXiaohong( <span class="hljs-number">400</span> , <span class="hljs-number">2</span> ) ;  

>    :
      <span class="hljs-number">400</span> mL   。
   :        ,  :<span class="hljs-number">400</span> mL,  :<span class="hljs-number">2</span>   。
>    :
      <span class="hljs-number">400</span> mL   。
   :        ,  :<span class="hljs-number">2</span> mL,  :<span class="hljs-literal">undefined</span>   。

【  】

<span class="hljs-number">1.</span>             ,           。<span class="hljs-built_in">arguments</span>    <span class="hljs-string">'  '</span>    shift  ,    :      <span class="hljs-number">400</span> mL   。
<span class="hljs-number">2.</span>   ,       ,      :   :        ,  :<span class="hljs-number">2</span> mL,  :<span class="hljs-literal">undefined</span>   。
      ,shift      :<span class="hljs-string">'  '</span>   <span class="hljs-string">' 1   '</span>   。     ,  <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">Array</span>.prototype.shift.apply( <span class="hljs-built_in">arguments</span> );    ,<span class="hljs-built_in">arguments</span>          ,<span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>]      <span class="hljs-number">400</span>!

       :

apply     ,         <span class="hljs-keyword">this</span>     ,               。<span class="hljs-string">'  '</span>      ,              。
<span class="hljs-built_in">arguments</span>  <span class="hljs-string">'    '</span>,    <span class="hljs-string">'     '</span><span class="hljs-built_in">Array</span>.prototype  ,               。
<span class="hljs-number">3.</span>        ,          xiaoming.makeJuice.apply( xiaohong , <span class="hljs-built_in">arguments</span> ) ;             mL   ,    <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>];     ,   <span class="hljs-string">' '</span>   。

       :


<span class="hljs-keyword">var</span> xiaoming = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>,
    makeJuice:<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water, time )</span>{</span>
        console.log( <span class="hljs-string">'   :'</span> + <span class="hljs-keyword">this</span>.name + <span class="hljs-string">'   '</span> + <span class="hljs-keyword">this</span>.fruit + <span class="hljs-string">' ,  :'</span> + water + <span class="hljs-string">' mL,  :'</span> + time + <span class="hljs-string">'   。'</span>);
    }
}
<span class="hljs-keyword">var</span> xiaohong = {
    name:<span class="hljs-string">'  '</span>,
    fruit:<span class="hljs-string">'  '</span>
}
<span class="hljs-keyword">var</span> wang = {
    name: <span class="hljs-string">'   '</span>,
    helpFromXiaohong: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water , time )</span>{</span>
        <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>];
        console.log( <span class="hljs-string">'      '</span> + w + <span class="hljs-string">' mL   。'</span> );  
        xiaoming.makeJuice.apply( xiaohong , <span class="hljs-built_in">arguments</span> ) ;
        }
}
wang.helpFromXiaohong( <span class="hljs-number">400</span> , <span class="hljs-number">2</span> ) ;  

  ,           :       apply     , <span class="hljs-number">1</span>       <span class="hljs-literal">null</span>,  , <span class="hljs-string">'  '</span>            <span class="hljs-keyword">this</span>,  ,       ?     <span class="hljs-literal">null</span>.name           。      ,       。   :     。
      ,          ,         ,         ,               ,  ,               。         ,         ,  :<span class="hljs-string">'        ?      ,      。'</span>        ,            ,         ,  ,   ,               ,           。

          ,    xiaohong    ,     xiaohong     ,   <span class="hljs-literal">null</span>   。

xiaoming.makeJuice.apply( xiaohong , <span class="hljs-built_in">arguments</span> ) ;
   :

xiaoming.makeJuice.apply( <span class="hljs-literal">null</span> , <span class="hljs-built_in">arguments</span> ) ;
              :

<span class="hljs-keyword">var</span> name = <span class="hljs-string">'  '</span>;
<span class="hljs-keyword">var</span> fruit = <span class="hljs-string">'  '</span> ;
   ,      :
      <span class="hljs-number">400</span> mL   。
   :        ,  :<span class="hljs-number">400</span> mL,  :<span class="hljs-number">2</span>   。

    ,           <span class="hljs-literal">null</span>,  ,      <span class="hljs-keyword">this</span>       ,       window( Chrome          )。   ,         <span class="hljs-keyword">this</span>,    apply      ,     <span class="hljs-literal">null</span>  ,    <span class="hljs-string">'      '</span>   ,        。

  ,  apply    ,        :

                <span class="hljs-keyword">this</span>,  ,          thisObj  ,               。      <span class="hljs-string">'   '</span>         ,             ?
        <span class="hljs-string">'  '</span>   ,  ,   apply     ,      <span class="hljs-literal">null</span>  thisObject。   <span class="hljs-string">'   '</span>,              ,     ,                  。
                :           <span class="hljs-string">'    '</span>,          。
  :       <span class="hljs-built_in">Math</span>.max( <span class="hljs-number">2</span> , <span class="hljs-number">10</span> , <span class="hljs-number">6</span> , <span class="hljs-number">1</span> );   ,      [<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">6</span>,<span class="hljs-number">1</span>]       。
-      <span class="hljs-built_in">Math</span>.max([<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">6</span>,<span class="hljs-number">1</span>]);    <span class="hljs-literal">NaN</span>。  <span class="hljs-built_in">Math</span>.max        [<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">6</span>,<span class="hljs-number">1</span>]       number。
-       :

<span class="hljs-keyword">var</span> test_array = [<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">6</span>,<span class="hljs-number">1</span>];
<span class="hljs-built_in">Math</span>.max( test_array[<span class="hljs-number">0</span>] , test_array[<span class="hljs-number">1</span>] , test_array[<span class="hljs-number">2</span>] , test_array[<span class="hljs-number">3</span>] );
  ,          ,       ^_^~~

[    ] [  ],[  ] [    ].......apply             ,  ,        :

 <span class="hljs-keyword">var</span> test_array = [<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">6</span>,<span class="hljs-number">1</span>];
 console.log(  <span class="hljs-built_in">Math</span>.max.apply( <span class="hljs-literal">null</span> , test_array ) );  <span class="hljs-comment">//  :10     </span>
          :<span class="hljs-number">10</span>,  ,      。

            ,          ?      apply     ,           :

xiaoming.makeJuice( <span class="hljs-built_in">arguments</span> ) ; 
                   :


<span class="hljs-keyword">var</span> wang = {
name: <span class="hljs-string">'   '</span>,
helpFromXiaohong: <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">( water , time )</span>{</span>
     <span class="hljs-keyword">var</span> w = <span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>];
     console.log( <span class="hljs-string">'      '</span> + w + <span class="hljs-string">' mL   。'</span> ); 
     xiaoming.makeJuice( <span class="hljs-built_in">arguments</span> ) ; 
  }
}

      helpFromXiaohong(        ),     xiaoming.makeJuice(       )。          <span class="hljs-string">'    '</span>   。      ,        。

          ...

  ?     call !

     ,call   apply                     ,   call     , <span class="hljs-number">1</span>     thisObject, <span class="hljs-number">2</span>            <span class="hljs-string">'    '</span>     。
  :
 apply     ,      :

<span class="hljs-keyword">var</span> task_info = [<span class="hljs-number">400</span>,<span class="hljs-number">2</span>];
xiaoming.makeJuice.apply( xiaohong , task_info ) ;
  call     ,      :

xiaoming.makeJuice.call( xiaohong , <span class="hljs-number">400</span> , <span class="hljs-number">2</span> ) 
   ,  call        apply     ,    <span class="hljs-built_in">Function</span>.prototype         call。JavaScript        ,      ,   JavaScript             call  ,         apply    ,    apply call         ,      。

        ,                  :


         ,   ,                 。
        ,                  (   :apply             ),
           ,                ,     (apply)        ,   apply    。

  ,   ,         ,       ,         ,          (call),  ,   call   。
<span class="hljs-string">"  ,          !          ?!"</span>
<span class="hljs-string">"     ,       ,       ,           。"</span>
<span class="hljs-string">"           !         !"</span>
<span class="hljs-string">"  ,       ,         。"</span>
  ,                ,      ,                  。
  ,        ,       ,     ,              ,   call  。

【  】

     ,        apply            ,          ,          <span class="hljs-built_in">arguments</span>       ,    apply           ,     apply     call       。
          ,      。</code>

좋은 웹페이지 즐겨찾기