<?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"
	>

<channel>
	<title>JSPatterns.com</title>
	<atom:link href="http://www.jspatterns.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jspatterns.com</link>
	<description>Exploring common JavaScript patterns and anti-patterns</description>
	<pubDate>Thu, 05 Aug 2010 21:11:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5-RC1</generator>
	<language>en</language>
			<item>
		<title>Singleton without a closure</title>
		<link>http://www.jspatterns.com/singleton-without-a-closure/</link>
		<comments>http://www.jspatterns.com/singleton-without-a-closure/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 23:09:26 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Object creation patterns]]></category>

		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=70</guid>
		<description><![CDATA[Warning: anti-pattern ahead.
Mwahaha, I feel like a ninja. I mean a ninja by Doug Crockford's definition which means someone who finds a mistake in the language's design, decides it's cool and abuses it.
So there you go. Regular expression objects are created only once if you're using a literal. Such an object can be used to [...]]]></description>
			<content:encoded><![CDATA[<p>Warning: anti-pattern ahead.</p>
<p>Mwahaha, I feel like a ninja. I mean a ninja by Doug Crockford's definition which means someone who finds a mistake in the language's design, decides it's cool and abuses it.</p>
<p>So there you go. Regular expression objects are created only once if you're using a literal. Such an object can be used to store the single instance of a Singleton() constructor.</p>
<h4>Implementation</h4>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">Single</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-quotes">&quot;</span><span class="hl-string">strict me not!</span><span class="hl-quotes">&quot;</span><span class="hl-code">;

    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">re</span><span class="hl-code"> = / /;
    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">re</span><span class="hl-code">.</span><span class="hl-identifier">instance</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">re</span><span class="hl-code">.</span><span class="hl-identifier">instance</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-identifier">re</span><span class="hl-code">.</span><span class="hl-identifier">instance</span><span class="hl-code"> = </span><span class="hl-reserved">this</span><span class="hl-code">;
    </span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">name</span><span class="hl-code"> = </span><span class="hl-quotes">&quot;</span><span class="hl-string">Foo</span><span class="hl-quotes">&quot;</span><span class="hl-code">;

</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">Single</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">.</span><span class="hl-identifier">getName</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">name</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">;</span></pre>
</div>
<h4>Test</h4>
<div class="hl-main">
<pre><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">s1</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">Single</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">,
    </span><span class="hl-identifier">s2</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">Single</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;

</span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">s1</span><span class="hl-code"> === </span><span class="hl-identifier">s2</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">s1</span><span class="hl-code">.</span><span class="hl-identifier">getName</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> &quot;Foo&quot;</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">s1</span><span class="hl-code">.</span><span class="hl-identifier">name</span><span class="hl-code"> = </span><span class="hl-quotes">&quot;</span><span class="hl-string">dude</span><span class="hl-quotes">&quot;</span><span class="hl-code">;
</span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">s2</span><span class="hl-code">.</span><span class="hl-identifier">getName</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> &quot;dude&quot;</span><span class="hl-comment"></span></pre>
</div>
<h4>Pros</h4>
<ul>
<li>The prototype chain works fine</li>
<li>No closures</li>
<li>No public properties or globals to store the single instance</li>
</ul>
<h4>Cons</h4>
<ul>
<li>It's a hack</li>
<li>ES5 defines that reg exp literals should no longer work like this</li>
</ul>
<h4>Verdict</h4>
<p>Don't use. Please <img src='http://www.jspatterns.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/singleton-without-a-closure/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Constants</title>
		<link>http://www.jspatterns.com/constants/</link>
		<comments>http://www.jspatterns.com/constants/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 07:12:26 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[closure]]></category>

		<category><![CDATA[constants]]></category>

		<category><![CDATA[private]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=69</guid>
		<description><![CDATA[Although there actually are constants in some environments, e.g. in Firefox you can use const instead of var, in general in JavaScript there are no constants.
Workaround
To work around that limitation, people often use ALLCAPPS to denote "hey, don't touch this var, it's meant to be a constant". It's constant-by-convention but the values can be changed [...]]]></description>
			<content:encoded><![CDATA[<p>Although there actually are constants in some environments, e.g. in Firefox you can use <code>const</code> instead of <code>var</code>, in general in JavaScript there are no constants.</p>
<h2>Workaround</h2>
<p>To work around that limitation, people often use ALLCAPPS to denote "hey, don't touch this var, it's meant to be a constant". It's constant-by-convention but the values can be changed by careless programmer on a bad day. If you really want to protect the value, you need to make it private.</p>
<h2>PHP-inspired API</h2>
<p>In PHP there are the functions <code>define(<em>name</em>, <em>value</em>)</code> to gefine a constant, <code>defined(<em>name</em>)</code> to check if a constant is defined and <code>constant(<em>name</em>)</code> to get the value of a constants when it's name is assembled at runtime and you don't know it <em>a priori</em>. So I thought - well, we can do the same in JavaScript. Only, let's not use global functions, but a <code>constant</code> global var and make the functions method of that global. <code>constant.constant(<em>name</em>)</code> is a little mouthful, so let's make that one <code>constant.get(<em>name</em>)</code></p>
<h2>Implementation</h2>
<p>Here's the simple implementation:</p>
<div class="hl-main">
<pre><span class="hl-quotes">&quot;</span><span class="hl-string">use strict</span><span class="hl-quotes">&quot;</span><span class="hl-code">;

</span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">constant</span><span class="hl-code"> = </span><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">constants</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">,
        </span><span class="hl-identifier">ownProp</span><span class="hl-code"> = </span><span class="hl-identifier">Object</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">.</span><span class="hl-identifier">hasOwnProperty</span><span class="hl-code">,
        </span><span class="hl-identifier">allowed</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-code">
            </span><span class="hl-identifier">string</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-code">,
            </span><span class="hl-identifier">number</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-code">,
            </span><span class="hl-reserved">boolean</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-code">
        </span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-identifier">define</span><span class="hl-code">: </span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">name</span><span class="hl-code">, </span><span class="hl-identifier">value</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
            </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">defined</span><span class="hl-brackets">(</span><span class="hl-identifier">name</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
                </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">false</span><span class="hl-code">;
            </span><span class="hl-brackets">}</span><span class="hl-code">
            </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-code">!</span><span class="hl-identifier">ownProp</span><span class="hl-code">.</span><span class="hl-identifier">call</span><span class="hl-brackets">(</span><span class="hl-identifier">allowed</span><span class="hl-code">, </span><span class="hl-reserved">typeof</span><span class="hl-code"> </span><span class="hl-identifier">value</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
                </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">false</span><span class="hl-code">;
            </span><span class="hl-brackets">}</span><span class="hl-code">
            </span><span class="hl-identifier">constants</span><span class="hl-brackets">[</span><span class="hl-identifier">name</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">value</span><span class="hl-code">;
            </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">true</span><span class="hl-code">;
        </span><span class="hl-brackets">}</span><span class="hl-code">,
        </span><span class="hl-identifier">defined</span><span class="hl-code">: </span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">name</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
            </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">ownProp</span><span class="hl-code">.</span><span class="hl-identifier">call</span><span class="hl-brackets">(</span><span class="hl-identifier">constants</span><span class="hl-code">, </span><span class="hl-identifier">name</span><span class="hl-brackets">)</span><span class="hl-code">;
        </span><span class="hl-brackets">}</span><span class="hl-code">,
        </span><span class="hl-identifier">get</span><span class="hl-code">: </span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">name</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
            </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">defined</span><span class="hl-brackets">(</span><span class="hl-identifier">name</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
                </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">constants</span><span class="hl-brackets">[</span><span class="hl-identifier">name</span><span class="hl-brackets">]</span><span class="hl-code">;
            </span><span class="hl-brackets">}</span><span class="hl-code">
            </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">null</span><span class="hl-code">;
        </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>This is it. Basically protect an object in a closure and don't provide means to change it, but only to add properties to it.</p>
<p>UPDATE: thanks to the comments (see below), there's extra care to check for own properties of the <code>constants</code> private object. This allows to define constants with weird names such as <code>toString</code> and <code>hasOwnProperty</code>. Also only primitive values are allowed to be constants.</p>
<h2>Usage</h2>
<div class="hl-main">
<pre><span class="hl-comment">//</span><span class="hl-comment"> check if defined</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">constant</span><span class="hl-code">.</span><span class="hl-identifier">defined</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">bazinga</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> false</span><span class="hl-comment"></span><span class="hl-code">

</span><span class="hl-comment">//</span><span class="hl-comment"> define</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">constant</span><span class="hl-code">.</span><span class="hl-identifier">define</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">bazinga</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Bazinga!</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">

</span><span class="hl-comment">//</span><span class="hl-comment"> check again</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">constant</span><span class="hl-code">.</span><span class="hl-identifier">defined</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">bazinga</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">

</span><span class="hl-comment">//</span><span class="hl-comment"> attempt to redefine</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">constant</span><span class="hl-code">.</span><span class="hl-identifier">define</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">bazinga</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Bazinga2</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> false</span><span class="hl-comment"></span><span class="hl-code">

</span><span class="hl-comment">//</span><span class="hl-comment"> was it constant or it changed?</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-comment">//</span><span class="hl-comment"> get da, get da, get da value</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">constant</span><span class="hl-code">.</span><span class="hl-identifier">get</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">bazinga</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> &quot;Bazinga!&quot;</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/constants/feed/</wfw:commentRss>
		</item>
		<item>
		<title>arguments considered harmful</title>
		<link>http://www.jspatterns.com/arguments-considered-harmful/</link>
		<comments>http://www.jspatterns.com/arguments-considered-harmful/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:04:42 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Coding practices]]></category>

		<category><![CDATA[arguments]]></category>

		<category><![CDATA[callee]]></category>

		<category><![CDATA[POLA]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=68</guid>
		<description><![CDATA[Inside every JavaScript function an arguments object is available containing all the parameters passed to the function. 

function aha(a, b) {
  console.log(arguments[0] === a); // true
  console.log(arguments[1] === b); // true
}

aha(1, 2);

However, it's not a good idea to use arguments for the reasons of :

performance
security

The arguments object is not automatically created every time [...]]]></description>
			<content:encoded><![CDATA[<p>Inside every JavaScript function an <code>arguments</code> object is available containing all the parameters passed to the function. </p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">aha</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">]</span><span class="hl-code"> === </span><span class="hl-identifier">a</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-brackets">]</span><span class="hl-code"> === </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">aha</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>However, it's not a good idea to use <code>arguments</code> for the reasons of :</p>
<ul>
<li>performance</li>
<li>security</li>
</ul>
<p>The <code>arguments</code> object is not automatically created every time the function is called, the JavaScript engine will only create it on-demand, if it's used. And that creation is not free in terms of performance. The difference between using arguments vs. not using it could be anywhere between <strong>1.5 times to 4 times slower</strong>, depending on the browser (<a href="http://webreflection.blogspot.com/2010/02/arguments-callee-call-and-apply.html">more info and bench</a>)</p>
<p>As for the security, there is the <a href="http://en.wikipedia.org/wiki/Principle_of_least_authority">POLA</a> (Principle of Least Authority) which is violated when one function A passes <code>arguments</code> to another B. Then a number of bad things can happen including:</p>
<ul>
<li>B calls A through arguments.callee - something A never intended when calling B in the first place</li>
<li>B overwrites some <code>arguments</code> and causes A to misbehave</li>
</ul>
<p>While in these scenarios B looks a little malicious, it can actually cause trouble unvoluntarilly. Consider this example that illustrates the second case (B changing values behind A's unsuspecting back)</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">A</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-code">, </span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">

  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> {p: 1}</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code">;  </span><span class="hl-comment">//</span><span class="hl-comment"> [1, 2, 3]</span><span class="hl-comment"></span><span class="hl-code">

  </span><span class="hl-identifier">B</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> oops!</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> {p: 2}</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code">;  </span><span class="hl-comment">//</span><span class="hl-comment"> [1, 2]</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">B</span><span class="hl-brackets">(</span><span class="hl-identifier">args</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">

  </span><span class="hl-comment">//</span><span class="hl-comment"> convenient innocent-looking local vars</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">o</span><span class="hl-code">=</span><span class="hl-identifier">args</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">]</span><span class="hl-code">,
      </span><span class="hl-identifier">a</span><span class="hl-code">=</span><span class="hl-identifier">args</span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-brackets">]</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> do something with the local variables</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">o</span><span class="hl-code">.</span><span class="hl-identifier">p</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code">;
  </span><span class="hl-identifier">a</span><span class="hl-code">.</span><span class="hl-identifier">pop</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> now the original arguments is </span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-comment">//</span><span class="hl-comment"> messed up because objects/arrays</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-comment">//</span><span class="hl-comment"> are passed by reference</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">A</span><span class="hl-brackets">(</span><span class="hl-brackets">{</span><span class="hl-identifier">p</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-brackets">}</span><span class="hl-code">, </span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-number">3</span><span class="hl-brackets">]</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<h2>ECMAScript 5</h2>
<p>In ECMAScript's "strict mode", using <code>arguments.callee</code> will throw a syntax error.</p>
<h2>Recursive anonymous function</h2>
<p>Probably the biggest argument for keeping <code>arguments</code> and <code>arguments.callee</code> is so that recursive anonymous functions can be created, because by using the <code>callee</code> property a function can call itself without knowing its own name. Now, this is not such a common scenario, but even if so, you can wrap a named function inside of an anonymous function and voila! - call that named function recursively without leaking a variable to the global scope.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/arguments-considered-harmful/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Function properties</title>
		<link>http://www.jspatterns.com/function-properties/</link>
		<comments>http://www.jspatterns.com/function-properties/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:24:00 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[cache]]></category>

		<category><![CDATA[function properties]]></category>

		<category><![CDATA[memoization]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=67</guid>
		<description><![CDATA[Since functions are objects, and objects are mutable in JavaScript, you can add properties to your functions.
Why? For caching results of computations for example. Here's a memoization done this way.

function myFunc(param){
    if (!myFunc.cache) {
        myFunc.cache = {};
    }
    if [...]]]></description>
			<content:encoded><![CDATA[<p>Since functions are objects, and objects are mutable in JavaScript, you can add properties to your functions.</p>
<p>Why? For caching results of computations for example. Here's a memoization done this way.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">myFunc</span><span class="hl-brackets">(</span><span class="hl-identifier">param</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-code">!</span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-code">!</span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> ...</span><span class="hl-comment"></span><span class="hl-code">
        </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">result</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>Here <code>myFunc()</code> gets a <code>cache</code> property which is an object. The function does the complicated computations based on a parameter and ends up with a <code>result</code> object. Using the parameter as a key in the <code>cache</code> object, it stores the result.</p>
<p>Consecutive calls with the same parameter will get the result from the cache, no need to compute the same result again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/function-properties/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lazy definition function</title>
		<link>http://www.jspatterns.com/lazy-definition-function/</link>
		<comments>http://www.jspatterns.com/lazy-definition-function/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:20:10 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[lazy definition]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=66</guid>
		<description><![CDATA[This has a nice name – a lazy function definition. A lazy function is one that pretends to work but it doesn't really.
It does some work initially and then caches the result. Then on consecutive calls it only returns the pre-computed result, it doesn’t really do anything.
In order to do so, the function redefines itself [...]]]></description>
			<content:encoded><![CDATA[<p>This has a nice name – a lazy function definition. A lazy function is one that pretends to work but it doesn't really.</p>
<p>It does some work initially and then caches the result. Then on consecutive calls it only returns the pre-computed result, it doesn’t really do anything.</p>
<p>In order to do so, the function redefines itself with a new implementation, one that simply points to the computed result.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code"> + </span><span class="hl-number">2</span><span class="hl-code">;
    </span><span class="hl-identifier">lazy</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 4</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 4</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/lazy-definition-function/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Self-overwriting functions</title>
		<link>http://www.jspatterns.com/self-overwriting-functions/</link>
		<comments>http://www.jspatterns.com/self-overwriting-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:18:24 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[overwriting]]></category>

		<category><![CDATA[self-definition]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=65</guid>
		<description><![CDATA[Next pattern – a function that overwrites itself, a self-redefining function. Pretty similar to functions that return functions, but this time the function is re-implemented from the inside, not returned.

function next() {
    var count = 1;
    next = function() {
        return ++count;
 [...]]]></description>
			<content:encoded><![CDATA[<p>Next pattern – a function that overwrites itself, a self-redefining function. Pretty similar to functions that <a href="http://www.jspatterns.com/returning-functions/">return functions</a>, but this time the function is re-implemented from the inside, not returned.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code"> = </span><span class="hl-number">1</span><span class="hl-code">;
    </span><span class="hl-identifier">next</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> ++</span><span class="hl-identifier">count</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 2</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/self-overwriting-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Returning functions</title>
		<link>http://www.jspatterns.com/returning-functions/</link>
		<comments>http://www.jspatterns.com/returning-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:13:56 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=64</guid>
		<description><![CDATA[Functions are objects, so they can be passed around like callbacks for example and also returned by other functions. 
You call a function that does some complicated setup and as a results returns a new function. You assign the result to a new function and use it afterwards.

function setup() {
    alert(1);
  [...]]]></description>
			<content:encoded><![CDATA[<p>Functions are objects, so they can be passed around like callbacks for example and also returned by other functions. </p>
<p>You call a function that does some complicated setup and as a results returns a new function. You assign the result to a new function and use it afterwards.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">my</span><span class="hl-code"> = </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> alerts 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">my</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> alerts 2</span><span class="hl-comment"></span></pre>
</div>
<p>Your setup function can store some private data in a closure and use that data somehow.</p>
<p>Here <code>setup()</code> creates a counter function, which gives a next ID for example. But the <code>count</code> variable is not exposed.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> ++</span><span class="hl-identifier">count</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">next</span><span class="hl-code"> = </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 2</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/returning-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Callbacks</title>
		<link>http://www.jspatterns.com/callbacks/</link>
		<comments>http://www.jspatterns.com/callbacks/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:04:44 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[callback]]></category>

		<category><![CDATA[event]]></category>

		<category><![CDATA[timeout]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=63</guid>
		<description><![CDATA[Since functions are objects they can be passed as arguments to other functions.

function test(a, b, fn) {
    fn(a, b);
}

In this simple example we have a function test() that takes a function fn as a third parameter and calls that function passing the first two parameters.
When you cal the test() function, you can [...]]]></description>
			<content:encoded><![CDATA[<p>Since functions are objects they can be passed as arguments to other functions.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-code">, </span><span class="hl-identifier">fn</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">fn</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>In this simple example we have a function <code>test()</code> that takes a function <code>fn</code> as a third parameter and calls that function passing the first two parameters.</p>
<p>When you cal the <code>test()</code> function, you can pass a pointer to an existing function <code>myFunc()</code> or you can also pass an anonymous function.</p>
<div class="hl-main">
<pre><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">myFunc</span><span class="hl-brackets">)</span><span class="hl-code">;

</span><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">one</span><span class="hl-code">, </span><span class="hl-identifier">two</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<h3>Examples</h3>
<p>For examples of this pattern in the wild – well, every time you attach an event listener, you pass a callback function.</p>
<div class="hl-main">
<pre><span class="hl-builtin">document</span><span class="hl-code">.</span><span class="hl-identifier">addEventListener</span><span class="hl-brackets">(</span><span class="hl-code">
    </span><span class="hl-quotes">'</span><span class="hl-string">click</span><span class="hl-quotes">'</span><span class="hl-code">,
    </span><span class="hl-identifier">animateAndWowUser</span><span class="hl-code">,
    </span><span class="hl-reserved">false</span><span class="hl-code">
</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>Same with timeouts and intervals. <code>setTimeout()</code> and <code>setInterval()</code> expect a function and call it back after the specified number of milliseconds.</p>
<div class="hl-main">
<pre><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">thePlotThickens</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">500ms later...</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-identifier">setTimeout</span><span class="hl-brackets">(</span><span class="hl-identifier">thePlotThickens</span><span class="hl-code">, </span><span class="hl-number">500</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>And here's a common anti-pattern – passing a string where a function is expected. The JavaScript engine has no choice but to evaluate the string (like with <code>eval()</code>) and execute it, which is unnecessary work.</p>
<div class="hl-main">
<pre><span class="hl-comment">//</span><span class="hl-comment"> anti-pattern</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">setTimeout</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">thePlotThickens()</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-number">500</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/callbacks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Self-executing functions</title>
		<link>http://www.jspatterns.com/self-executing-functions/</link>
		<comments>http://www.jspatterns.com/self-executing-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:55:42 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[bookmarklet]]></category>

		<category><![CDATA[self-executing]]></category>

		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=62</guid>
		<description><![CDATA[Update: "Immediate functions" sounds like a much better name.
Self-executable functions are simple and powerful.
All you do is add a set of parentheses after the function and this causes it to be executed right there. If it’s an anonymous function you also need to wrap it in parentheses.

(function(){
   var a = 1;
   [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong>: "Immediate functions" sounds like a much better name.</p>
<p>Self-executable functions are simple and powerful.</p>
<p>All you do is add a set of parentheses after the function and this causes it to be executed right there. If it’s an anonymous function you also need to wrap it in parentheses.</p>
<div class="hl-main">
<pre><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
   </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">a</span><span class="hl-code"> = </span><span class="hl-number">1</span><span class="hl-code">;
   </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">b</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code">;
   </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code"> + </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>You can also pass parameters to the self-executing function if you want.</p>
<div class="hl-main">
<pre><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">c</span><span class="hl-code"> = </span><span class="hl-identifier">a</span><span class="hl-code"> + </span><span class="hl-identifier">b</span><span class="hl-code">;
  </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-identifier">c</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>So how is this pattern useful? </p>
<p>It’s useful when you have some work to do, some initialization maybe. You need to do it only once and you don’t want to leave any globals lying around after the work is finished. All the temporary variables you need like <code>c</code> in the case above remain local and don't pollute the namespace.</p>
<p>Useful also when your code is kind of a guest to the page. Like a bookmarklet for example, or a widget of some sorts. You don’t want to add your variables and functions to the host page’s naming space and possibly causing a naming conflict with the page's core code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/self-executing-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Functions are objects</title>
		<link>http://www.jspatterns.com/functions-are-objects/</link>
		<comments>http://www.jspatterns.com/functions-are-objects/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:52:08 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[objects]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=61</guid>
		<description><![CDATA[Functions are objects, it’s very important to keep that in mind.
Functions are objects so they can have properties. And they they have methods.
They can be copied, deleted, passed as arguments to other functions, returned by other functions.
They also provide scope.
And they have special feature that sets them apart from the other objects – they are [...]]]></description>
			<content:encoded><![CDATA[<p>Functions are objects, it’s very important to keep that in mind.</p>
<p>Functions are objects so they can have properties. And they they have methods.</p>
<p>They can be copied, deleted, passed as arguments to other functions, returned by other functions.</p>
<p>They also provide scope.</p>
<p>And they have special feature that sets them apart from the other objects – they are invokable, they can be called.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/functions-are-objects/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
