<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>function &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/function/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sun, 01 Dec 2013 01:37:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;bind&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/01/jaac2013-b-bind.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 01 Dec 2013 01:37:56 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3621</guid>

					<description><![CDATA[&#8220;B&#8221; は bindの &#8220;B&#8221;。 Function.prototype.bind function に生えている bind メソッドは、関数の &#8220;this&#8 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;B&#8221; は bindの &#8220;B&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-rkUitT-4lD8/UqR4fk2zrwI/AAAAAAAACYg/42t0yW3xi90/s400/ac2013-b.png" alt="B"/></figure>



<p></p>



<span id="more-3621"></span>



<h2 class="wp-block-heading">Function.prototype.bind</h2>



<p>function に生えている bind メソッドは、関数の &#8220;this&#8221; を他のオブジェクトに固定する事ができます。 役割は call/apply と似ていますが、即実行されるのではなく function を返す点で異なります。</p>



<p><a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind">Function.prototype.bind &#8211; JavaScript | MDN</a></p>



<p>イベントハンドラの登録等でよく使っています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> app = {
    <span class="hljs-attr">name</span>: <span class="hljs-string">"app"</span>,
    <span class="hljs-attr">el</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-attr">init</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.el = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"myform"</span>);
        <span class="hljs-keyword">this</span>.el.addEventListener(<span class="hljs-string">"submit"</span>, <span class="hljs-keyword">this</span>.onSubmit.bind(<span class="hljs-keyword">this</span>), <span class="hljs-literal">false</span>);
    },
    <span class="hljs-attr">onSubmit</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        e.preventDefault();
        <span class="hljs-comment">// 通常ここの"this"はHTMLFormElementですが、</span>
        <span class="hljs-comment">// bindされているので"this"はappオブジェクトになります</span>
        <span class="hljs-built_in">console</span>.log(<span class="hljs-keyword">this</span>.name); <span class="hljs-comment">// "app"</span>
        <span class="hljs-keyword">var</span> form = e.target; <span class="hljs-comment">// フォームエレメントを取得する時は引数から</span>
    }
};
app.init();
</code></span></pre>


<h3 class="wp-block-heading">引数を追加する</h3>



<p>bindは第二引数以降で、関数に渡す引数を追加することができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> app = {
    <span class="hljs-attr">name</span>: <span class="hljs-string">"app"</span>,
    <span class="hljs-attr">el</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-attr">init</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.el = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"myform"</span>);
        <span class="hljs-keyword">this</span>.el.addEventListener(<span class="hljs-string">"submit"</span>, <span class="hljs-keyword">this</span>.onSubmit.bind(<span class="hljs-keyword">this</span>), <span class="hljs-literal">false</span>);
    },
    <span class="hljs-attr">onSubmit</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b, c</span>)</span>{
        <span class="hljs-comment">// 追加引数は先頭に追加される</span>
        c.preventDefault();
        <span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">arguments</span>); <span class="hljs-comment">// "foo", "bar", Event</span>
    }
};
app.init();
</code></span></pre>


<p>注意が必要なのは、追加の引数は先頭に追加される点。 はじめの引数をイベントオブジェクトだと思って preventDefault したけど動かなかった！ なんてことがないようにしましょう。</p>



<h3 class="wp-block-heading">removeEventListener できない問題</h3>



<p>関数を bind して addEventListener で登録した後、removeEventListener しようとするとうまく動かない場合があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">el.addEventListener(<span class="hljs-string">"click"</span>, someHandler.bind(someObj));

<span class="hljs-comment">// 以下の両者とも、remove できない</span>
el.removeEventListener(<span class="hljs-string">"click"</span>, someHandler);
el.removeEventListener(<span class="hljs-string">"click"</span>, someHandler.bind(someObj));
</code></span></pre>


<p>これは、bind が function を無名変数でラップして別の物にして返してしまう為です。 removeEventListener でイベントハンドラを解除する為には、addEventListener で設定した物と同一でなければなりません。</p>



<p>例えば、bind で返った function を一度変数に格納する事で、回避する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> boundHandler = someHandler.bind(someObj);
el.addEventListener(<span class="hljs-string">"click"</span>, boundHandler);

<span class="hljs-comment">// remove できる</span>
el.removeEventListener(<span class="hljs-string">"click"</span>, boundHandler);
</code></span></pre>


<p>あるいは、下記参考リンクのように handleEvent を使う手もあるようです。</p>



<ul class="wp-block-list">
<li><a href="http://blog.wnotes.net/blog/article/misunderstood-function-prototype-bind">Function.prototype.bindで困った話 | ブログ :: Web notes.log</a></li>
</ul>



<h2 class="wp-block-heading">jQuery.fn.proxy</h2>



<p>bindと似た役割をもつメソッドがjQueryのproxyメソッドです。追加の引数も bind と同様に使えます。</p>



<p><a href="http://api.jquery.com/jQuery.proxy/">jQuery.proxy() | jQuery API Documentation</a></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#myform"</span>).on(<span class="hljs-string">"submit"</span>, $.proxy(<span class="hljs-keyword">this</span>.onSubmit, <span class="hljs-keyword">this</span>));
</code></span></pre>


<p>jQueryを使用しているならこれで十分役割を果たせますが、 特に理由がなければ既に定義されているbindを使って行った方が自然だと思います。</p>



<h2 class="wp-block-heading">使える環境</h2>



<p>bind メソッドはEcmaScript5で定義されていますが、勿論古いブラウザでは使えない場合があります。 IEで対応しているのが9以降なので、8以前でも使いたい場合は <a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility">MDNにあるコード</a> を使用するか、<a href="https://github.com/kriskowal/es5-shim">es5-shim.js</a> に頼るか、自前で定義しておく必要があります。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
