Javascript não é só um linguagem de apoio a web, ela é muito mais do que isso, ela pode ser utilizada muito bem no lugar de tantas outras, desde que você saiba o verdadeiro potencial dela. Nesta apresentação eu coloco vários atributos introduzidos e possibilitados no ECMA5.
6. Um mix de paradigmas
Funcional()
Orientado a {objetos}
7. HookHook
function main(){
var a = 1;
hooked(); //undefined
function hooked(){
console.log(eita);
}
var eita = 15;
hooked(); //15
unhookfn(); //Uncaught TypeError: a is not a function
var unhookfn = function(){
console.log("shiiii");
};
}
10. ClojuresClojures
function main(){
var a = 1;
hooked();
function sub(){
var b = a + 2;
function deep(){
var a = b + 2;
}
for(var i = 0; i<10; i++){
var d += i;
}
console.log(d);
}
function hooked(){
console.log(eita);
}
var eita = 15;
}
11. Function como ClassFunction como Class
function MinhaClasse(arg){
var privado = typeof(arg);
this.publico = arg;
this.nome = "Qualquer nome";
this["prop 3"] = 4569;
this.novaFunc = function(){
console.log("novaFunc");
}
function funcaoPrivada(){
console.log("funcaoPrivada");
}
function outraFuncaoPrivada(){
console.log("funcaoPrivada");
}
this.exporFuncaoPrivada = funcaoPrivada;
}
var meuObjeto = new MinhaClasse("argumento");
12. Cadeia de Protótipo & thisCadeia de Protótipo & this
function Pessoa(nome){
this.nome = nome;
}
Pessoa.prototype = {
obterUltimoNome: function(){
return Array.prototype.slice.call(this.nome.split(" "), -1)[0];
}
};
function PessoaFisica(nome, cpf){
Pessoa.call(this, nome);
this.cpf = cpf;
}
PessoaFisica.prototype = new Pessoa();
PessoaFisica.prototype.constructor = PessoaFisica; //Corrigir o ponteiro do const
PessoaFisica.prototype.obterCpf = function(){
console.log(this);
return this.cpf;
};
Pessoa.__proto__ --> Object
PessoaFisica.__proto__ --> Pessoa
PessoaFisica.__proto__.__proto__ --> Object
13. Outra forma de criar objetos eOutra forma de criar objetos e
extenderextender
var Pessoa = {
nome: "Nome do Debil",
sayMyName: function(){
console.log(this.nome);
}
};
var PessoaFisica = Object.create(Pessoa);
19. BindBind
var newFn = fn.bind(contexto, args[]);
function multi(x, y){
return x * y;
}
var double = multi.bind(null, 2);
double(2); // 4
double(10); // 20
20. Bind foi inspirado em um CurryingBind foi inspirado em um Currying
Function.prototype.curry = function () {
var _self = this,
slice = Array.prototype.slice,
args = slice.call(arguments, 1);
return function () {
return _self.apply(null, args.concat(slice.call(arguments)));
};
};
32. RegexRegex
var re = /ab+c/;
var re = new RegExp('ab+c');
"abbbbbcafafcABC".replace(/ab+c/gi, "");
33. transformando query string emtransformando query string em
objectobject
function getQueryString(window) {
if (window.location.search) {
return window.location.search.substr(1).split("&")
.reduce(function (previousValue, currentValue, index, array) {
var aux = currentValue.split('=');
previousValue[aux[0]] = decodeURIComponent(aux[1].replace(/+/g, "
return previousValue;
}, {});
} else {
return {};
}
}
34. 'use strict''use strict';;
this em function sem new
window | undefined
a = 5; //sem var
window.a | ReferenceError: a is not defined
with (what?) não é permitido
Muitas palavras necessárias são consideradas como
reservadas
Não permite declaração de propriedades duplicadas
É criado um contexto unico de execução para evals