<?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 &#8211; Turbosite &#8211; Blog</title>
	<atom:link href="https://www.turbosite.com.br/blog/tag/javascript-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.turbosite.com.br/blog</link>
	<description></description>
	<lastBuildDate>Tue, 02 Dec 2014 13:44:03 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://www.turbosite.com.br/blog/wp-content/uploads/2026/09/cropped-logo_turbo_vermelha-32x32.png</url>
	<title>javascript &#8211; Turbosite &#8211; Blog</title>
	<link>https://www.turbosite.com.br/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Aviso de alterações na página para não perder dados &#8211; Javascript</title>
		<link>https://www.turbosite.com.br/blog/aviso-de-alteracoes-na-pagina-para-nao-perder-dados-javascript/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Tue, 02 Dec 2014 13:44:03 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[alertar usuario]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3860</guid>

					<description><![CDATA[Nesta postagem, vamos mostrar como impedir que seu usuário feche o browser sem salvar os dados digitados. Emitir um alerta pode fazer com que horas de trabalho sejam poupadas.]]></description>
										<content:encoded><![CDATA[<p>Nesta postagem, vamos mostrar como impedir que seu usuário feche o browser sem salvar os dados digitados. Isto é muito comum em Webmail ou formulários/dados importantes que o usuário digitou e sem querer, muda de página ou a fecha, para evitar que perca as informações utilizaremos esta técnica para alertá-lo e assim, ele tomar a decisão necessária.</p>
<p>O evento que vamos utilizar é o &#8220;onBeforeUnload&#8221;.</p>
<p>Este evento é sempre invocado quando o usuário tenta sair da página atual, mas, ele por si só não resolve o problema, para resolvermos, precisamos dizer ao browser o que fazer quando isto acontecer.</p>
<p>&nbsp;</p>
<p>Um exemplo de código seria:</p>
<pre class="lang:php decode:true ">$('body').on('click', function(){
    window.onbeforeunload = function(){
        return 'Os dados do formulário não foram salvos, deseja permanecer nesta página?';
    };
});</pre>
<p>&nbsp;</p>
<p>Desta forma, quando o evento foi setado, ao mudar de página ou qualquer ação que faça ele fechar a página, será enviada uma mensagem ao browser, como o exemplo abaixo:</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-3861" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2.jpg" alt="javascript2" width="359" height="176" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2.jpg 359w, https://www.turbosite.com.br/blog/wp-content/uploads/2014/12/javascript2-300x147.jpg 300w" sizes="(max-width: 359px) 100vw, 359px" /></p>
<p>Então, uma forma de fazer isto em um formulário seria, quando carregar a página salvar o estado do formulário para comparar, caso ele tome alguma ação que saia da página, sendo quê, temos que desconsiderar o &#8220;SUBMIT&#8221;, pois neste caso a ação é desejada.</p>
<p>Exemplo de código:</p>
<pre class="lang:php decode:true ">$( function(){

	var init_form = $('#id_form').serialize();
	// Result example: "name=&amp;email=&amp;message="

	// Cancel event onbeforeunload when Submit form
	$(':submit').click(function() {
		window.onbeforeunload = null;
	});
	
	window.onbeforeunload = function(){
		var check_form = $('#id_form').serialize();
		
		if( check_form === init_form )
		return null;
		
		return 'Os dados do formulário não foram salvos, deseja permanecer nesta página?';
	};
});</pre>
<p>&nbsp;</p>
<p><strong>Conclusão:</strong></p>
<p>Isto pode ser utilizado para diversas formas, avisar o preenchimento de um formulário não enviado, salvar o rascunho de um e-mail/mensagem, dar um desconto em um produto caso o usuário feche a tela de concluir a compra e outras milhares de formas que vocês imaginarem.</p>
<p>&nbsp;</p>
<p><strong>Dicas e sugestões:</strong><br />
Deixem nos comentários.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Incríveis Animações com CSS</title>
		<link>https://www.turbosite.com.br/blog/incriveis-animacoes-com-css/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Fri, 28 Nov 2014 12:47:45 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[animacao css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[Destaque]]></category>
		<category><![CDATA[dica turbosite]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3839</guid>

					<description><![CDATA[Com este plugin de CSS, você poderá animar sua página de forma profissional e encantadora. Dê dinamismo e ao mesmo tempo um toque sutil de modernidade ao seu site.]]></description>
										<content:encoded><![CDATA[<p>Esta postagem é baseada na página <a href="http://www.justinaguilar.com/animations/index.html#how">Justinaguilar</a>. Com este plugin CSS, você poderá animar suas páginas de forma profissional e encantadora.&nbsp;Vale a pena conferir.</p>
<p>A forma de utilizar é muito simples, basta adicionar o arquivo css animation e inserir a classe ao objeto que deve ser animado, exemplo:</p>
<p>Inserção do CSS das animações:</p>
<pre class="lang:xhtml decode:true">&lt;link rel="stylesheet" href="css/animations.css"&gt;</pre>
<p>Adicionando classe ao objeto que será animado:</p>
<pre class="lang:php decode:true">&lt;div id="object" class="slideUp"&gt;</pre>
<p>Abaixo você pode conferir o resultado das animações, clique nos links para ver os diversos efeitos:</p>
<p><iframe src="//jsfiddle.net/pv4zg3sw/2/embedded/result/" width="100%" height="500" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>CSS:<br />
<iframe src="//jsfiddle.net/pv4zg3sw/2/embedded/css/" width="100%" height="500" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Javascript:<br />
<iframe loading="lazy" src="//jsfiddle.net/pv4zg3sw/2/embedded/js/" width="100%" height="500" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Html:<br />
<iframe loading="lazy" src="//jsfiddle.net/pv4zg3sw/2/embedded/html/" width="100%" height="500" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Para fazer com que a animação seja ativada quando o usuário ver o item, você deve colocar este código em Javascript e css, sendo que, deve ser carregado o Jquery antes:</p>
<p>CSS:</p>
<pre class="lang:css decode:true ">#object{
	background-color: #fe5652;
	visibility: hidden;
}</pre>
<p>JS:</p>
<pre class="lang:js decode:true ">&lt;script&gt;
	$(window).scroll(function() {
		$('#animatedElement').each(function(){
		var imagePos = $(this).offset().top;

		var topOfWindow = $(window).scrollTop();
			if (imagePos &lt; topOfWindow+400) {
				$(this).addClass("slideUp");
			}
		});
	});
&lt;/script&gt;</pre>
<p>Para ver o exemplo, acessem este <a href="http://www.justinaguilar.com/animations/scrolling.html">LINK</a>.</p>
<p>Esperamos que tenham gostado e aprendido, dúvidas e sugestões deixem nos comentários, isto incentiva-nos a sempre compartilhar conhecimento cada vez mais!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Entenda o que são Closures em JavaScript</title>
		<link>https://www.turbosite.com.br/blog/entenda-o-que-sao-closures-em-javascript/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Mon, 10 Nov 2014 12:21:06 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Closure]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3713</guid>

					<description><![CDATA[Entenda com facilidade o que são Closures em JavaScript. Muito usado em jQuery e Node.js, Closures permitem uma programação criativa e concisamente.]]></description>
										<content:encoded><![CDATA[<p>Encontramos uma publicação do blog <a title="Javascript Brasil" href="http://javascriptbrasil.com/2013/10/12/entenda-closures-no-javascript-com-facilidade/" rel="home">Javascript Brasil</a> que explica, com facilidade, o que são <strong>Closures</strong> em <strong>JavaScript</strong>. Closures permitem uma programação criativa e concisamente. Eles são usados frequentemente no JavaScript, sendo fáceis de se entender e atraentes para serem usados em seus projetos. É bastante comum encontrar closures em códigos <em>jQuery</em> e <em>Node.js</em>. Abaixo você pode conferir um clássico exemplo de closure em jQuery.</p>
<pre class="lang:js decode:true">$(function () {
    var selections = [];
    $(".niners").click(function () {
        selections.push(this.prop ("name"));
    });
});</pre>
<p>A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> repassamos esse conhecimento com a postagem abaixo.</p>
<p>&nbsp;</p>
<h2><strong>O que é um closure?</strong></h2>
<p>Um closure é uma função interior que tem acesso a variáveis de uma função exterior – cadeia de escopo. O closure tem três cadeias de escopo: o seu próprio escopo; escopo externo, tendo acesso as variáveis da função exterior; e tem acesso as variáveis globais.</p>
<p>A função interior tem acesso não somente as variáveis da função exterior, mas também aos parâmetros dela. Note que a função interior não pode chamar o objeto(<i>arguments)</i> da função exterior, entretanto, pode chamar parâmetros da função externa diretamente.</p>
<p>Você cria um closure adicionando uma função dentro de outra função.</p>
<div id="crayon-54609aabf262f135225674" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-main">
<pre class="lang:js decode:true">function showName (firstName, lastName) {
    var nameIntro = "Your name is ";
 
    //esta função interior tem acesso as variáveis da função exterior, incluindo os parâmetros
    function makeFullName () {
        return nameIntro + firstName + " " + lastName;
    }
 
    return makeFullName ();
}
 
showName ("Michael", "Jackson"); //Your name is Michael Jackson</pre>
</div>
</div>
<div id="crayon-54609aabf2640726497822" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover"></div>
<h2><strong>Regra dos Closures e Efeitos Colaterais</strong></h2>
<h3><strong>1. Closures tem acesso a variável das funções exteriores mesmo após o retorno da função exterior</strong></h3>
<p>Uma da mais importante e delicada característica dos closures é que a função interior continua tendo acesso as variáveis da função exterior mesmo após ela ter retornado.  Quando funções no JavaScript executam, elas usam a mesma cadeia de escopo que estava em vigor quando foram criadas. Isso significa que mesmo depois da função exterior retornar, a função interior continua tendo acesso as variáveis da função exterior. Portanto, você pode chamar a função interior depois em seu programa. Este exemplo demonstra isso:</p>
<div id="crayon-54609aabf2647041099827" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-main">
<pre class="lang:js decode:true ">function celebrityName (firstName) {
    var nameIntro = "This celebrity is ";
 
    //essa função interior tem acesso as variáveis da função exterior, incluindo os parâmetros
    function lastName (theLastName) {
        return nameIntro + firstName + " " + theLastName;
    }
    return lastName;
}
 
var mjName = celebrityName ("Michael");
//Nesta conjuntura, a função exterior celebrityName foi retornada
 
//O closure (lastName) é chamado aqui depois da função exterior ter retornado acima
//Sim, o closure continua tendo acesso as variáveis da função exterior e parâmetros
mjName ("Jackson"); //This celebrity is Michael Jackson</pre>
<p>&nbsp;</p>
</div>
</div>
<h3><strong>2. Closures armazenam referências para as variáveis da função exterior</strong></h3>
<p>Eles não armazenam o valor real. Closures ficam mais interessantes quando o valor da variável da função exterior muda antes que o closure seja chamado, e esta poderosa característica pode ser aproveitada de formas criativas, como este exemplo de variável privada primeiramente demonstrada por Douglas Crockford:</p>
<div id="crayon-54609aabf264d409673630" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-plain-wrap">
<pre class="lang:js decode:true ">function celebrityID () {
    var celebrityID = 999;
    //Nós retornamos um objeto com algumas funções interiores
    //Todas as funções interiores têm acesso as variáveis'da função exterior
    return {
        getID: function () {
            //Esta função interior vai retornar a variável celebrityID ATUALIZADA
            return celebrityID;
        },
        setID: function (theNewId) {
            //Esta função interior vai mudar a variável da função exterior a qualquer hora
            celebrityID = theNewId;
        }
    }
}
 
var mjID = celebrityID (); //Nesta atual conjuntura, a função exterior celebrityID já retornou
mjID.getID(); //999
mjID.setID(567); //Muda a variável da função exterior
mjID.getID(); //567 - retorna o valor atualizado da variável celebrityID</pre>
<p>&nbsp;</p>
</div>
</div>
<p>&nbsp;</p>
<h3><strong>3. Closures que deram errado</strong></h3>
<p>Por causa dos closures terem acesso ao valor atualizado das variáveis das funções exteriores, eles podem também conduzir a erros quando a variável da função exterior muda com um loop for. Assim:</p>
<pre class="lang:js decode:true ">//Este exemplo é explicado em detalhe abaixo (logo após este bloco de código)
function celebrityIDCreator (theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i &amp;lt; theCelebrities.length; i += 1) {
        theCelebrities[i]["id"] = function () {
            return uniqueID + i;
        }
    }
 
    return theCelebrities;
}
 
var actionCelebs = [{name:"Stallone", id:0}, {name:"Cruise", id:0}, {name:"Willis", id:0}];
 
var createIdForActionCelebs = celebrityIDCreator(actionCelebs);
 
var stalloneID = createIdForActionCelebs[0];
 
console.log(stalloneID.id()); //103</pre>
<p>No exemplo anterior, quando a função anônima é chamada, o valor de i é 3 (a contagem do array e então seus incrementos). O número 3 foi adicionado ao uniqueID para criar 103 para TODOS os celebrityID. Então cada posição no array retornado obteve o id = 103, ao invés do valor pretendido 100, 101, 102.</p>
<p>A razão para isso acontecer foi porque, assim como nós discutimos no exemplo anterior, o closure (função anônima neste exemplo) teve acesso a variável da função exemplo por referência, não por valor. Então, igual ao exemplo anteriormente mostrado onde nós acessamos o valor atualizado da variável com o closure, neste exemplo, similarmente acessamos a variável i quando ela foi alterada, depois que a função exterior rodou o loop for inteiro e retornou o último valor, que foi 103.</p>
<p>Para consertar este efeito colateral (bug) nos closures, você pode usar uma <strong>Expressão de Função Imediatamente Invocada</strong> (IIFE – Immediately Invoked Function Expression), como no exemplo seguinte:</p>
<div id="crayon-54609aabf265a506956951" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover">
<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay">
<pre class="lang:js decode:true ">function celebrityIDCreator (theCelebrities) {
    var i;
    var uniqueID = 100;
    for (i = 0; i &amp;lt; theCelebrities.length; i += 1) {
        theCelebrities[i]["id"] = function (j) { //a variável paramétrica j é o i passado na invocação da IIFE
            return function () {
                return uniqueID + j;
                //cada iteração do loop for passa no valor atual de i dentro desta IIFE e salva o valor correto no array
            } () //Adicionando () no fim da função, nós estamos executando-a imediatamente e retornando somente o valor de uniqueID + j, ao invés de retornar uma função
        } (i); //invocando imediatamente a função passando a variável i como um parâmetro
    }
    return theCelebrities;
}
 
var actionCelebs = [{name: "Stallone", id:0}, {name: "Cruise", id:0}, {name: "Willis", id:0}];
 
var createIdForActionCelebs = celebrityIDCreator (actionCelebs);
 
var stalloneID = createIdForActionCelebs [0];
console.log(stalloneID.id); //100
 
var cruiseID = createIdForActionCelebs [1];
console.log(cruiseID.id); //101</pre>
<p>&nbsp;</p>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScript IIFE como contêiner de códigos</title>
		<link>https://www.turbosite.com.br/blog/javascript-iife-como-conteiner-de-codigos/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Thu, 06 Nov 2014 13:21:07 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Destaque]]></category>
		<category><![CDATA[IIFE]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3697</guid>

					<description><![CDATA[Nessa postagem, repassamos nosso conhecimento sobre JavaScript IIFE. Descubra o que é e por que é uma boa prática usá-la sempre que puder.]]></description>
										<content:encoded><![CDATA[<p>Encontramos uma postagem interessante sobre Javascript IIFE no blog <a href="http://desenvolvimentoparaweb.com/javascript/javascript-iife-conteiner-de-codigos/">Desenvolvimento Para Web</a>, que explica em muitos detalhes a sintaxe e as funcionalidades do IIFE. A equipe da <a href="https://www.turbosite.com.br/">Turbosite</a> repassa esse conhecimento para os leitores do nosso blog, com a postagem a seguir.</p>
<p>&nbsp;</p>
<p><strong>JavaScript puro</strong> ou <em>Vanilla JavaScript</em> (felizmente) está voltando. E com força. Mas, quando você decide continuar nos estudos e começa a inspecionar códigos alheios, inevitavelmente você se depara com algo como:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    //
})(window, document);</pre>
<p>E você encontra isso em diversos códigos; e vê outros desenvolvedores indicando; e colegas dizendo que esta é uma boa prática. Mas você sabe o que, realmente, isso significa? Continue lendo.</p>
<p>&nbsp;</p>
</div>
<p>Frequentemente desenvolvedores descobrindo (ou redescobrindo) o JavaScript puro se perguntam sobre <strong>IIFE</strong> (Expressão de Função Imediatamente Invocada ou <em>Immediately-Invoked Function Expression</em>), frequentemente apresentado da seguinte maneira:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    //
})(window, document);</pre>
<p>Na verdade, várias coisas estão acontecendo aí. Analisemos cada uma delas.</p>
<p>&nbsp;</p>
</div>
<h2>Escopo privado em IIFE</h2>
<p>JavaScript tem maneiras interessantes de trabalhar com escopo de função; então, primeiramente essa expressão cria um “âmbito privado” (private scope). Por exemplo:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    var name = 'Foo';
})(window, document);
console.log(name); // "name" não definido, está em um escopo diferente</pre>
<p>&nbsp;</p>
</div>
<h2>Como funciona IIFE</h2>
<p>Uma função normal se parece com isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var logMyName = function (name) {
    console.log(name);
};
logMyName('Foo');</pre>
</div>
<p>Ela é chamada (<em>invoke</em>) quando necessário, por escolha do programador, em qualquer ponto do código em que se queira e/ou seja possível.</p>
<p>A razão pela qual essa <strong>IIFE em JavaScript</strong> foi criada, foi para ser uma expressão de função imediatamente invocada, o que significa que elas são imediatamente chamadas em tempo de execução – também, não é possível chamá-la novamente, já que elas só rodam uma vez, mais ou menos assim:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">var logMyName = (function (name) {
    console.log(name); // Todd
})('Todd');</pre>
<p>O pulo-do-gato aqui é isso (que já foi atribuído a uma variável no exemplo anterior):</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function () {
})();</pre>
</div>
<p>O par de parênteses extra é necessário. Isso não funciona:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">function () {
}();</pre>
<p>Embora existam vários truques que podem ser feitos para “enganar” o JavaScript e fazê-lo funcionar. Este, por exemplo, força o parser de JavaScript a tratar o código que segue <code>!</code> como uma expressão:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">!function () {
}();</pre>
<p>E existem variantes:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">+function () {
}();
 
-function () {
}();
 
~function () {
}();</pre>
</div>
<p>Mas não é preciso se forçar a decorar isso para usar a todo momento para fazer uma IIFE.</p>
<p>&nbsp;</p>
<h2>Argumentos da IIFE</h2>
<p>Agora que foi explicado como isso funciona, passemos para os argumento da IIFE:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window) {
})(window);</pre>
<p>Como isso funciona? Lembre-se, <code>(window);</code> é onde a função é chamada, e onde é passado o Objeto <code>window</code>. Então ele é passado para a função – que também foi chamada de <code>window</code>.</p>
</div>
<p>Então, o que mais é possível fazer? Passar tudo o que for necessário! Por exemplo, passar o Objeto <code>document</code>:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document) {
    // é possível usar "window" e "document" normalmente
})(window, document);</pre>
</div>
<p>A resolução de variáveis ​​locais é mais rápida que a de variáveis ​​globais, mas esta está numa escala enorme e dificilmente alguém vai perceber o aumento da velocidade – mas vale a pena considerar se há muitas referências a globais!</p>
<p>&nbsp;</p>
<h2>E sobre o <code>undefined</code>?</h2>
<p>Em ECMAScript 3, <code>undefined</code> é mutável. Isso significa que o valor poderia ser transferido com, por exemplo, <code>undefined = true;</code>…! Felizmente, no ECMAScript 5 em modo estrito (<code>'use strict';</code>) o parser lança um erro quando se depara com isso. Antes disso, começou-se a proteger uma IIFE da maneira já vista:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document) {
    // é possível usar "window" e "document" normalmente
})(window, document);</pre>
<pre class="lang:js decode:true">(function (window, document, undefined) {
})(window, document);</pre>
<p>O que significa que se alguém fizesse isso estaria tudo bem:</p>
</div>
<div class="wp_syntax">
<pre class="lang:js decode:true">undefined = true;
(function (window, document, undefined) {
    // "undefined" é uma variável local undefined
})(window, document);</pre>
<p>&nbsp;</p>
</div>
<h2>Minificando</h2>
<p>Ao minificar as variáveis ​​locais é que a grandiosidade do padrão IIFE realmente pode ser vista. Nomes de variáveis ​​locais não são realmente necessários se estas foram passadas dessa maneira​​, então, é possível dar o nome que quiser para elas.</p>
<p>Por exemplo, mudar disso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (window, document, undefined) {
    console.log(window); // Object window
})(window, document);</pre>
</div>
<p>Pra isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (a, b, c) {
    console.log(a); // Object window
})(window, document);</pre>
</div>
<p>Imagine todas as referências a bibliotecas e <code>window</code> e <code>document</code> minificadas. Claro que você não precisa parar por aí; é possível passar jQuery, também, ou qualquer outra coisa que esteja disponível dentro no escopo léxico:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function ($, window, document, undefined) {
    // use $ para se referir à jQuery
    // $(document).addClass('test');
})(jQuery, window, document);
 
(function (a, b, c, d) {
    // Se torna
    // a(c).addClass('test');
})(jQuery, window, document);</pre>
</div>
<p>Isso também significa que você não precisa chamar <code>jQuery.noConflict();</code> ou qualquer coisa como <code>$</code> é atribuído localmente ao módulo. Aprender como escopos e variáveis ​​globais/locais funcionam ajuda ainda mais.</p>
<p>Passar o código por um bom minificador certamente garantirá a renomeação de <code>undefined</code> para <code>c</code> (por exemplo, e apenas se for usado). É importante atentar para o fato de que o nome <code>undefined</code> é irrelevante; só é preciso saber que o Objeto referenciado é indefinido (undefined) e, como <code>undefined</code> não tem qualquer significado especial – <code>undefined</code> é o valor que o JavaScript dá às coisas que são declaradas mas não têm nenhum valor (nem em IIFE).</p>
<p>&nbsp;</p>
<h2>Ambientes globais não-navegador</h2>
<p>Devido a algumas tecnologias, Node.js, o navegador não é sempre o Objeto global, o que pode ser realmente problemático se você está tentando criar uma IIFE para funcionar em múltiplos ambientes. Por esta razão, há determinadas “alternativas”, como isso:</p>
<div class="wp_syntax">
<pre class="lang:js decode:true ">(function (root) {
})(this);</pre>
</div>
<p>Em um navegador, o ambiente global <code>this</code> se refere ao Objeto <code>window</code>, de modo que não é preciso passar em <code>window</code>, é sempre possível reduzir para <code>this</code>.</p>
<p>Alguns preferem o nome <code>root</code>, já que ele pode se referir tanto a ambientes não-navegador, quanto à raiz do browser.</p>
<p>Se você estiver interessado em uma solução universal (muito útil para ser usada para a criação de módulos em projetos de código aberto) é o <strong>UMD</strong> (<em>Universal Module Definition</em>):</p>
<div class="wp_syntax">
<pre class="lang:js decode:true">(function (root, factory) {
    if (typeof define === 'function' &amp;&amp; define.amd) {
        define(factory);
    } else if (typeof exports === 'object') {
        module.exports = factory;
    } else {
        root.MYMODULE = factory();
    }
})(this, function () {
    // 
});</pre>
</div>
<p>A função está sendo invocado com outra função sendo passada para ela. É possível, então, atribuí-la ao ambiente relevante “de dentro”. No navegador, <code>root.MYMODULE = factory();</code> é o módulo IIFE; em qualquer outro ambiente (como Node.js), será usado <code>module.exports</code> ou requireJS se <code>define === 'function' &amp;&amp; define.amd</code> resolver como <code>true</code>.</p>
<p>&nbsp;</p>
<h2>Conclusão</h2>
<p>Como foi visto, usar <strong>IIFE</strong> (Expressão de Função Imediatamente Invocada ou <em>Immediately-Invoked Function Expression</em>) é extramente benéfico. Além de ajudar na performance, por permitir que não seja preciso lookups no código a procura de variáveis globais, permite que seu código possa ficar “isolado”, protegendo o escopo de uma porção de código ou módulo do ambiente em que foi colocado.</p>
<p>O fato de diversos frameworks e bibliotecas JavaScript de renome como jQuery, Backbone.js, Modernizr e outros usarem IIFE já é bastante significativo. Use código de qualidade para fazer código de qualidade. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Utilizando Namespacing em JavaScript</title>
		<link>https://www.turbosite.com.br/blog/utilizando-namespacing-em-javascript/</link>
		
		<dc:creator><![CDATA[turboajuda]]></dc:creator>
		<pubDate>Wed, 17 Sep 2014 15:10:48 +0000</pubDate>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Destaque]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[programacao javascript]]></category>
		<category><![CDATA[programacao js]]></category>
		<guid isPermaLink="false">http://blog.turbosite.com.br/?p=3559</guid>

					<description><![CDATA[Técnica de como Utilizando Namespacing em JavaScript. Como não existe um método formal, vamos aplicar técnicas interessantes para a construção deste recurso.]]></description>
										<content:encoded><![CDATA[<p>Esta é uma postagem encontrada no site <a title="Desenvolvimento para Web" href="http://desenvolvimentoparaweb.com/miscelanea/namespacing-em-javascript/">Desenvolvimento para Web</a>, achamos interessante e decidimos publicá-la. Para quem desenvolve em Javascript, será útil e sem dúvida algum novo conhecimento será adquirido, então leia o texto completo. Este artigo é baseado no <span lang="en">post <a href="http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/">Namespacing in JavaScript</a></span> do <span lang="en"><a href="http://javascriptweblog.wordpress.com/">JavaScript, JavaScript</a>.</span></p>
<p>Namespacing em JavaScript pode ser considerado algo um pouco nebuloso no começo, mas a organização (e, de certa forma, proteção) de seu código é algo essencial, que deve ser encarado com muita seriedade e feito com bastante atenção. JavaScript não possui uma construção formal de namespace, então é preciso saber como “simular” namespaces para que se possa desfrutar das vantagens que eles oferecem.</p>
<p>Variáveis ​​globais devem ser reservadas a objetos que têm relevância para todo o sistema e estas devem ser nomeadas para evitar ambiguidades e minimizar o risco de colisões de nomes. Na prática, isso significa que você deve evitar a criação de objetos globais a menos que eles sejam absolutamente necessários. Mas você já sabia disso, certo?!</p>
<blockquote><p>Você deve evitar a criação de objetos globais a menos que eles sejam absolutamente necessários.</p></blockquote>
<p>Então, o que você faz sobre isso? A “sabedoria popular” mostra que a melhor estratégia de redução de risco é criar um pequeno número de objetos globais que servirão como namespaces de facto para módulos subjacentes e subsistemas. A seguir, várias abordagens para namespacing em JavaScript interessantes, que você pode usar em seus projetos imediatamente.</p>
<h2>Namespacing Estático (Static Namespacing)</h2>
<p>O termo “namespacing estático” está sendo usado como um termo genérico para soluções em que a denominação “namespace” consta numa codificação, propriamente dita. É verdade, você pode reatribuir de um namespace para outro, mas o novo namespace vai referenciar os mesmos objetos como se fossem os antigos.</p>
<h3>Atribuição Direta (Direct Assignment)</h3>
<p>Essa é a abordagem mais básica. Exige mais código, mas é segura e inequívoca.</p>
<pre class="lang:js decode:true ">var myApp = {}
 
myApp.id = 0;
 
myApp.next = function() {
    return myApp.id++;  
}
 
myApp.reset = function() {
    myApp.id = 0;   
}
 
window.console &amp;&amp; console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
); // 0, 1, undefined, 0</pre>
<p>Você poderia tornar a manutenção futura um pouco mais fácil usando <strong>this</strong> para fazer referência a propriedades irmãs, mas isso é um pouco arriscado, já que não há nada que impeça suas funções no namespace de serem reatribuídas:</p>
<pre class="lang:js decode:true">var myApp = {}
 
myApp.id = 0;
 
myApp.next = function() {
    return this.id++;   
}
 
myApp.reset = function() {
    this.id = 0;    
}
 
myApp.next(); // 0
myApp.next(); // 1
var getNextId = myApp.next;
getNextId(); // NaN whoops!</pre>
<h3>Notação de Objeto Literal (Object Literal Notation)</h3>
<p>Nesta abordagem, é preciso fazer referência ao nome de namespace apenas uma vez, então, caso seja preciso alterar o nome mais tarde, isso é um pouco mais fácil de se conseguir (supondo que você não tenha referenciado o namespace muitas vezes). Há, ainda, o perigo de que o valor de <strong>this</strong> possa ser uma surpresa – mas é um pouco mais seguro assumir que os objetos definidos dentro de uma construção de objeto literal não serão reatribuídos.</p>
<pre class="lang:js decode:true">var myApp = {
    id: 0,
 
    next: function() {
        return this.id++;   
    },
 
    reset: function() {
        this.id = 0;    
    }
}
 
window.console &amp;&amp; console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) // 0, 1, undefined, 0</pre>
<h3>Padrão de Módulo (Module Pattern)</h3>
<p>Hoje em dia é bastante comum encontrar por aí o Padrão de Módulo (Module Pattern) em código JavaScript. A lógica é protegida do escopo global por uma função wrapper (geralmente numa IIFE) que retorna um objeto que representa a interface pública do módulo. Por imediatamente invocar a função e atribuir o resultado a uma variável de namespace, a API do módulo é “trancada” nesse namespace.</p>
<p>Além disso, todas as variáveis ​​não incluídas no valor de retorno permanecerão privadas, visíveis apenas para as funções públicas que lhes referenciam.</p>
<pre class="lang:js decode:true">var myApp = (function() {
 
    var id = 0;
 
    return {
        next: function() {
            return id++;    
        },
 
        reset: function() {
            id = 0;     
        }
    };  
})();   
 
window.console &amp;&amp; console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) // 0, 1, undefined, 0</pre>
<h2>Namespacing Dinâmico (Dynamic Namespacing)</h2>
<p>Esta seção também poderia muito bem ser chamada de “injeção de namespace” (ou namespace injection). O namespace é representado por um proxy que é referenciado diretamente dentro do wrapper da função – o que significa que não é mais preciso agrupar valores para o return no namespace. Isso faz com que a definição de namespace seja mais flexível e torna muito fácil ter várias instâncias independentes de um módulo existente em namespaces separados (ou até mesmo no contexto global).</p>
<div>Namespacing dinâmico suporta todas as características do Padrão de Módulo com a vantagem adicional de ser intuitivo e de fácil leitura.</div>
<h3>Passando argumento de namespace</h3>
<p>Aqui o namespace é simplesmente passado como um argumento de uma <a title="JavaScript IIFE como contêiner de códigos" href="http://desenvolvimentoparaweb.com/javascript/javascript-iife-conteiner-de-codigos/">Expressão de Função Imediatamente Invocada</a>. A variável id é privada porque não é atribuída ao contexto.</p>
<pre class="lang:php decode:true">var myApp = {};
(function(context) { 
    var id = 0;
 
    context.next = function() {
        return id++;    
    };
 
    context.reset = function() {
        id = 0;     
    }
})(myApp);  
 
window.console &amp;&amp; console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) // 0, 1, undefined, 0</pre>
<p>É possível até mesmo definir o contexto para o objeto global – com a mudança de uma palavra! Este é um grande trunfo para os fornecedores da bibliotecas (vendors), que podem envolver suas features numa IIFE e permitir que o programador decida se elas devem ser globais ou não (<a href="http://ejohn.org/">John Resig</a> foi um dos primeiros a adotar esse conceito quando escreveu a jQuery).</p>
<pre class="lang:php decode:true">var myApp = {};
(function(context) { 
    var id = 0;
 
    context.next = function() {
        return id++;    
    };
 
    context.reset = function() {
        id = 0;     
    }
})(this);   
 
window.console &amp;&amp; console.log(
    next(),
    next(),
    reset(),
    next()
) // 0, 1, undefined, 0</pre>
<h3>this como proxy de namespace</h3>
<p>O artigo “<a href="http://blogs.sitepoint.com/2010/11/30/my-favorite-javascript-design-pattern/">My Favorite JavaScript Design Pattern</a>” aparentemente foi mal compreendido por muitos que pensaram que ele poderia simplesmente recorrer ao Module Pattern. O artigo mostra várias técnicas (o que provavelmente contribuiu para essa confusão), mas, em essência, é muito interessante e dá ensejo ao desenvolvimento de muita coisa boa relacionada a namespacing.</p>
<p>A beleza do padrão é que ele simplesmente usa a linguagem como foi projetada – nada mais, nada menos, sem truques, sem firulas. Além disso, já que o namespace é injetado através da palavra-chave <strong>this</strong> (que é estática dentro de um determinado contexto de execução), ele não pode ser acidentalmente modificado.</p>
<pre class="lang:js decode:true">var myApp = {};
(function() {
    var id = 0;
 
    this.next = function() {
        return id++;    
    };
 
    this.reset = function() {
        id = 0;     
    }
}).apply(myApp);    
 
window.console &amp;&amp; console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
); // 0, 1, undefined, 0</pre>
<p>Ainda melhor, a API de apply (e call) provê separação natural entre contexto e argumentos; então, fica simples passar argumentos adicionais para o criador do módulo.</p>
<p>O exemplo a seguir demonstra isso e também mostra como executar o módulo de forma independente através de múltiplos namespaces:</p>
<pre class="lang:php decode:true">var subsys1 = {}, subsys2 = {};
 
var nextIdMod = function(startId) {
    var id = startId || 0;
 
    this.next = function() {
        return id++;    
    };
 
    this.reset = function() {
        id = 0;     
    }
};
 
nextIdMod.call(subsys1);    
nextIdMod.call(subsys2,1000);   
 
window.console &amp;&amp; console.log(
    subsys1.next(),
    subsys1.next(),
    subsys2.next(),
    subsys1.reset(),
    subsys2.next(),
    subsys1.next()
) // 0, 1, 1000, undefined, 1001, 0</pre>
<p>E, se for preciso um gerador global de id:</p>
<pre class="lang:js decode:true">nextIdMod();    
 
window.console &amp;&amp; console.log(
    next(),
    next(),
    reset(),
    next()
) // 0, 1, undefined, 0</pre>
<p>Mas essa ferramenta de gerar de ids mostrada como exemplo não faz jus a todo o potencial desse padrão. Envolvendo uma biblioteca inteira e usando a palavra-chave <strong>this</strong> como um suporte para o namespace, é fácil executar a biblioteca em qualquer contexto que se queira (incluindo o contexto global).</p>
<pre class="lang:php decode:true">// Código de biblioteca
var protoQueryMooJo = function() {  
    // [...]
}
 
// Seu código
var thirdParty = {};
protoQueryMooJo.apply(thirdParty);</pre>
<h2>Considerações finais sobre Namespacing em JavaScript</h2>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3562" src="https://www.turbosite.com.br/blog/wp-content/uploads/2014/09/namespacing-javascript-metafora-turbosite.jpg" alt="namespacing-javascript-metafora-turbosite" width="379" height="317" srcset="https://www.turbosite.com.br/blog/wp-content/uploads/2014/09/namespacing-javascript-metafora-turbosite.jpg 379w, https://www.turbosite.com.br/blog/wp-content/uploads/2014/09/namespacing-javascript-metafora-turbosite-300x251.jpg 300w" sizes="auto, (max-width: 379px) 100vw, 379px" /></p>
<p>É uma prática comum tentar evitar namespaces aninhados. Eles são mais difíceis de seguir (para ambos, humanos e computadores) e vão encher seu código de confusão desnecessária. <a href="http://michaux.ca/articles/javascript-namespacing">Como Peter Michaux aponta</a>, namespaces aninhados podem ser um legado de desenvolvedores Java nostálgicos tentando recriar aquelas cadeias longas de pacotes que eles conheciam e amavam…</p>
<p>É possível “propagar” um único namespace através de diversos arquivos.js (embora apenas por injeção de namespace ou atribuição direta de cada variável), contudo, é preciso ter cuidado com as dependências. Além disso, “ligar” um namespace a um arquivo pode ajudar o leitor a navegar mais facilmente pelo código.</p>
<p>Uma vez que JavaScript não possui uma construção formal de namespace, isso abre margem para vários tipos de soluções criativas para resolver a questão. Este artigo mostrou apenas algumas delas e, evidentemente, as melhores podem não terem sido abordadas, dada a vasta contribuição da comunidade a cada dia.</p>
<p>De qualquer forma, estas são algumas das mais conhecidas técnicas para namespacing em JavaScript e, garantimos, estudando um pouco além e sabendo aplicar corretamente em seus projetos, certamente você terá um incremento de qualidade de código considerável! </p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
