<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Call、apply和bind on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/callapply%E5%92%8Cbind/</link><description>Recent content in Call、apply和bind on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/callapply%E5%92%8Cbind/index.xml" rel="self" type="application/rss+xml"/><item><title>call、apply和bind</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/call-apply-bind/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/call-apply-bind/</guid><description>&lt;h2 id="apply-和-call简介"&gt;&lt;code&gt;apply&lt;/code&gt; 和 &lt;code&gt;call&lt;/code&gt;简介&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;javascript&lt;/code&gt; 中，&lt;code&gt;call&lt;/code&gt; 和 &lt;code&gt;apply&lt;/code&gt; 都是为了改变某个函数运行时的上下文（&lt;code&gt;context&lt;/code&gt;）而存在的，换句话说，就是为了改变函数体内部 &lt;code&gt;this&lt;/code&gt; 的指向。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;JavaScript&lt;/code&gt; 的一大特点是，函数存在「&lt;code&gt;定义时上下文&lt;/code&gt;」和「&lt;code&gt;运行时上下文&lt;/code&gt;」以及「&lt;code&gt;上下文是可以改变的&lt;/code&gt;」这样的概念。&lt;/p&gt;
&lt;p&gt;比如 &lt;code&gt;A&lt;/code&gt; 对象有一个方法，而 &lt;code&gt;B&lt;/code&gt; 对象因为某种原因，也需要用到同样的方法，那么这时候不用单独为 &lt;code&gt;B&lt;/code&gt; 对象扩展一个方法，可以直接借用 A 对象的方法。这样既完成了需求，又减少了内存的占用。&lt;/p&gt;
&lt;p&gt;直接来看个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function fruits() {} fruits.prototype = { color: &amp;#34;red&amp;#34;, say: function() { console.log(&amp;#34;My color is &amp;#34; + this.color); }} var apple = new fruits();apple.say(); //My color is red
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是如果我们有一个对象 &lt;code&gt;banana= {color : &amp;quot;yellow&amp;quot;}&lt;/code&gt; ,我们不想对它重新定义 &lt;code&gt;say&lt;/code&gt; 方法，那么我们可以通过 &lt;code&gt;call&lt;/code&gt; 或 &lt;code&gt;apply&lt;/code&gt; 用 &lt;code&gt;apple&lt;/code&gt; 的 &lt;code&gt;say&lt;/code&gt; 方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;banana = { color: &amp;#34;yellow&amp;#34;}apple.say.call(banana); //My color is yellowapple.say.apply(banana); //My color is yellow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="applycall-的区别"&gt;apply、call 的区别&lt;/h2&gt;
&lt;p&gt;对于 apply、call 二者而言，作用完全一样，只是接受参数的方式不太一样。例如，有一个函数定义如下：&lt;/p&gt;</description></item></channel></rss>