<?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>JavaScript: Singuska &#187; escopo</title>
	<atom:link href="http://javascript.singuska.com/tag/escopo/feed/" rel="self" type="application/rss+xml" />
	<link>http://javascript.singuska.com</link>
	<description>Fragmentos de código e gambiarras (0.2)</description>
	<lastBuildDate>Mon, 03 Oct 2011 19:45:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Escopo (variáveis globais / locais)</title>
		<link>http://javascript.singuska.com/2009/12/09/escopo-variaveis-globais-locais/</link>
		<comments>http://javascript.singuska.com/2009/12/09/escopo-variaveis-globais-locais/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 20:45:21 +0000</pubDate>
		<dc:creator>Flávio</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[escopo]]></category>

		<guid isPermaLink="false">http://javascript.singuska.com/?p=14</guid>
		<description><![CDATA[A palavra reservada var em JavaScript define a variável como sendo local ao bloco de escopo onde está sendo declarada: 1 2 3 4 5 6 7 8 9 10 11 12 var x = 1; &#160; function fn1&#40;&#41; &#123; var x = 2; alert&#40;x&#41;; &#125; function fn2&#40;&#41; &#123; alert&#40;x&#41;; &#125; &#160; fn1&#40;&#41;; fn2&#40;&#41;; O [...]]]></description>
			<content:encoded><![CDATA[<p>A palavra reservada <strong>var</strong> em JavaScript define a variável como sendo local ao bloco de escopo onde está sendo declarada:</p>
<p><span class="jsrun-exemplo-1 jsrun-button"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #fbde2d; font-weight: bold;">var</span> x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">1</span><span style="color: #ffffff;">;</span>
&nbsp;
<span style="color: #fbde2d; font-weight: bold;">function</span> fn1<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span> <span style="color: #ffffff;">&#123;</span>
    <span style="color: #fbde2d; font-weight: bold;">var</span> x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">2</span><span style="color: #ffffff;">;</span>
    <span style="color: red;">alert</span><span style="color: #ffffff;">&#40;</span>x<span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
<span style="color: #ffffff;">&#125;</span>
<span style="color: #fbde2d; font-weight: bold;">function</span> fn2<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span> <span style="color: #ffffff;">&#123;</span>
    <span style="color: red;">alert</span><span style="color: #ffffff;">&#40;</span>x<span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
<span style="color: #ffffff;">&#125;</span>
&nbsp;
fn1<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
fn2<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span></pre></td></tr></table></div>

<p>O resultado é: <strong>2</strong> e depois <strong>1</strong>. Neste exemplo, uma outra variável x (que por acaso tem o mesmo nome) foi definida dentro da função fn1. Por isso, ao executarmos a função fn2 o valor original da variável declarada na linha 1 permanece.</p>
<p>Para que o resultado fosse <strong>2</strong> e <strong>2</strong>:</p>
<p><span class="jsrun-exemplo-2 jsrun-button"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #fbde2d; font-weight: bold;">var</span> x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">1</span><span style="color: #ffffff;">;</span>
&nbsp;
<span style="color: #fbde2d; font-weight: bold;">function</span> fn1<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span> <span style="color: #ffffff;">&#123;</span>
    x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">2</span><span style="color: #ffffff;">;</span> <span style="color: #bfbfbf; font-style: italic;">// atribuição de valor sem var</span>
    <span style="color: red;">alert</span><span style="color: #ffffff;">&#40;</span>x<span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
<span style="color: #ffffff;">&#125;</span>
<span style="color: #fbde2d; font-weight: bold;">function</span> fn2<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span> <span style="color: #ffffff;">&#123;</span>
    <span style="color: red;">alert</span><span style="color: #ffffff;">&#40;</span>x<span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
<span style="color: #ffffff;">&#125;</span>
&nbsp;
fn1<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span>
fn2<span style="color: #ffffff;">&#40;</span><span style="color: #ffffff;">&#41;</span><span style="color: #ffffff;">;</span></pre></td></tr></table></div>

<p>A modificação da linha 4 altera o valor da variável declarada na linha 1 e temos, consequentemente, o mesmo resultado nos dois alerts (trata-se da mesma variável com o mesmo nome).</p>
<p>Note que na linha 1 dos dois exemplos a variável foi declarada utilizando-se <strong>var</strong>. Entretanto, a remoção de var não implica em nenhuma mudança de comportamento. Isso acontece porque neste caso a declaração ocorre no escopo mais &#8220;exterior&#8221; do nosso código. Com ou sem <strong>var</strong> ela pode ser considerada global.</p>
<h3>E porque isso é importante?</h3>
<p>O uso de variáveis globais é uma péssima prática. A variável pode ser utilizada e modificada por qualquer parte do código. Isso é fonte de inúmeros bugs. A não ser que seja realmente necessário, sempre declare as variáveis como locais. É possível (e recomendável) declarar várias variáveis locais de uma vez:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #fbde2d; font-weight: bold;">var</span> x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">1</span><span style="color: #ffffff;">,</span> y<span style="color: #ffffff;">,</span> z<span style="color: #ffffff;">;</span> <span style="color: #bfbfbf; font-style: italic;">// boa prática</span>
&nbsp;
    <span style="color: #fbde2d; font-weight: bold;">var</span> x <span style="color: #ffffff;">=</span> <span style="color: #f78465;">1</span><span style="color: #ffffff;">;</span> <span style="color: #bfbfbf; font-style: italic;">// não tão boa</span>
    <span style="color: #fbde2d; font-weight: bold;">var</span> y<span style="color: #ffffff;">;</span>
    <span style="color: #fbde2d; font-weight: bold;">var</span> z<span style="color: #ffffff;">;</span>
<span style="color: #ffffff;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://javascript.singuska.com/2009/12/09/escopo-variaveis-globais-locais/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

