<?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>TheHippo &#187; scope</title>
	<atom:link href="http://blog.thehippo.de/tag/scope/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.thehippo.de</link>
	<description>if (i=1) throw null;</description>
	<lastBuildDate>Wed, 02 Mar 2011 18:06:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JavaScript curiosity: mixing function and global scope</title>
		<link>http://blog.thehippo.de/2010/05/programming/javascript-curiosity-mixing-function-and-global-scope/</link>
		<comments>http://blog.thehippo.de/2010/05/programming/javascript-curiosity-mixing-function-and-global-scope/#comments</comments>
		<pubDate>Mon, 31 May 2010 15:05:46 +0000</pubDate>
		<dc:creator>Hippo</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[curiosity]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[scope]]></category>
		<category><![CDATA[var]]></category>
		<category><![CDATA[variable]]></category>

		<guid isPermaLink="false">http://blog.thehippo.de/?p=237</guid>
		<description><![CDATA[I am developing with JavaScript for a while and I am used to a lot of it quirks. But even after years of using this language you still find new curiosities. Today a struggled a while with this one.
Considering this piece of JavaScript code:
var i = 10;
function foo() {
	i++; // i is now 11
	console.log("foo1: ...]]></description>
			<content:encoded><![CDATA[<p>I am developing with <a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank">JavaScript</a> for a while and I am used to a lot of it quirks. But even after years of using this language you still find new curiosities. Today a struggled a while with this one.<br />
Considering this piece of JavaScript code:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> i = <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i++; <span class="co1">// i is now 11</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo1: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0</span>; <span class="co1">// i is now 0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo2: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global1: &quot;</span>+i<span class="br0">&#41;</span>; <span class="co1">// should be 10</span></div>
</li>
<li class="li1">
<div class="de1">foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global2: &quot;</span>+i<span class="br0">&#41;</span>; <span class="co1">// and now 0</span></div>
</li>
</ol>
</div>
<p>Ok. That&#8217;s fine. Now we change the code a little bit to this one:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> i = <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i++; <span class="co1">// is now 11</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo1: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> i = <span class="nu0">0</span>; <span class="co1">//create a new variable with value 0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo2: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global1: &quot;</span>+i<span class="br0">&#41;</span>; <span class="co1">// expect: 10</span></div>
</li>
<li class="li1">
<div class="de1">foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global2: &quot;</span>+i<span class="br0">&#41;</span>; <span class="co1">// expect: 11</span></div>
</li>
</ol>
</div>
<p>What do you expect? I was quite surprised:<span id="more-237"></span></p>
<blockquote><p>global1: 10<br />
foo1: NaN<br />
foo2: 0<br />
global2: 10</p></blockquote>
<p>Why do we get a <strong>Not a Number</strong>? Why is JavaScript not using the global var as in the first example? Why is the global variable <strong>i</strong> not increased, the operation took place before the declaration of the local variable <strong>i</strong>? JavaScript has some &#8220;strange&#8221; rules about variable declaration. Every variable declared within a function is initialised at the beginning of the function, so our function actually would look like this:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> i = <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> i; <span class="co1">//undefined</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i++; <span class="co1">// undefined + 1 = NaN</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo1: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0</span>; <span class="co1">//and now 0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;foo2: &quot;</span>+i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global1: &quot;</span>+i<span class="br0">&#41;</span>; <span class="co1">//10</span></div>
</li>
<li class="li2">
<div class="de2">foo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;global2: &quot;</span>+i<span class="br0">&#41;</span>;<span class="co1">//still 10, because global i has not changed</span></div>
</li>
</ol>
</div>
<p>Looking into the rules of <a title="JSLint" href="http://www.jslint.com/" target="_blank">JSLint</a> which helps to verify JavaScript code to improve the quality of your JavaScript you get a few rules how to safely declare variables:</p>
<ul>
<li>JavaScript allows var definitions to occur anywhere within a function. JSLint is more strict.</li>
<li>JSLint expects that a var will be declared only once, and that it will be declared before it is used.</li>
<li>JSLint expects that a function will be declared before it is used.</li>
<li>JSLint expects that parameters will not also be declared as vars.</li>
<li>JSLint does not expect the arguments array to be declared as a var.</li>
<li>JSLint does not expect that a var will be defined in a block. This is because JavaScript blocks do not have block scope. This can have unexpected consequences. Define all variables at the top of the function.</li>
</ul>
<p>So Remember:<strong> Variables are not initialised when they are declared!</strong></p>
<p>Links:</p>
<ul>
<li>all <a title="JSLint rules" href="http://www.jslint.com/lint.html" target="_blank">JSLint rules</a> for quality JavaScript code.</li>
<li><a title="WTFJS.com" href="http://wtfjs.com/" target="_blank">WTFJS.com</a>, a page collection all kinds of JavaScript curiosities.</li>
</ul>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://blog.thehippo.de/2010/05/programming/javascript-curiosity-mixing-function-and-global-scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.243 seconds -->

