Você já deu uma olhada no código fonte do jQuery 1.4 e percebeu como ele é encapsulado da seguinte maneira:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Eu li um artigo sobre JavaScript Namespacing e outro chamado " An Important Pair of Parens ", para saber um pouco do que está acontecendo aqui.
Mas nunca vi essa sintaxe específica antes. O que isso está undefined
fazendo aí? E por que window
precisa ser aprovado e depois aparecer no final novamente?
javascript
jquery
syntax
dkinzer
fonte
fonte
Respostas:
O indefinido é uma variável normal e pode ser alterado simplesmente com
undefined = "new value";
. Portanto, o jQuery cria uma variável local "indefinida" que é REALMENTE indefinida.A variável window é feita local por razões de desempenho. Porque quando o JavaScript procura uma variável, ele primeiro percorre as variáveis locais até encontrar o nome da variável. Quando não é encontrado, o JavaScript passa pelo próximo escopo etc. até filtrar pelas variáveis globais. Portanto, se a variável da janela for tornada local, o JavaScript poderá procurar mais rapidamente. Mais informações: Acelere seu JavaScript - Nicholas C. Zakas
fonte
Indefinido
Declarar
undefined
como argumento, mas nunca passar um valor para ele garante que ele seja sempre indefinido, pois é simplesmente uma variável no escopo global que pode ser substituída. Isso faza === undefined
uma alternativa segura paratypeof a == 'undefined'
, o que salva alguns caracteres. Também torna o código mais amigável ao minifier, comoundefined
pode ser reduzido para,u
por exemplo, salvando mais alguns caracteres.Janela
Passar
window
como argumento mantém uma cópia no escopo local, o que afeta o desempenho: http://jsperf.com/short-scope . Todos os acessoswindow
agora precisam percorrer um nível a menos na cadeia de escopo. Assim como aconteceundefined
, uma cópia local novamente permite minificação mais agressiva.Nota:
Embora isso possa não ter sido a intenção dos desenvolvedores do jQuery, a transferência
window
permite que a biblioteca seja mais facilmente integrada nos ambientes Javascript do servidor, por exemplo, node.js - onde não háwindow
objeto global . Em tal situação, apenas uma linha precisa ser alterada para substituir owindow
objeto por outra. No caso do jQuery, umwindow
objeto simulado pode ser criado e transmitido para fins de raspagem de HTML (uma biblioteca como o jsdom pode fazer isso).fonte
(function(a,b){})(window);
-a
eb
são muito mais curtos do quewindow
eundefined
:)Outros já explicaram
undefined
.undefined
é como uma variável global que pode ser redefinida para qualquer valor. Essa técnica é para impedir que todas as verificações indefinidas sejam quebradas se alguém escreveu digamos, emundefined = 10
algum lugar. Um argumento que nunca é passado é garantido como real,undefined
independentemente do valor da variávelundefined
.A razão para passar pela janela pode ser ilustrada com o exemplo a seguir.
O que o console registra? O valor do
window
objeto certo? Errado! 10? Errado! Ele registraundefined
. O interpretador Javascript (ou compilador JIT) o reescreve desta maneira -No entanto, se você receber a
window
variável como argumento, não haverá var e, portanto, nenhuma surpresa.Eu não sei se o jQuery está fazendo isso, mas se você estiver redefinindo
window
a variável local em qualquer lugar da sua função por qualquer motivo, é uma boa ideia emprestá-la do escopo global.fonte
window
é passado dessa maneira, apenas no caso de alguém decidir redefinir o objeto de janela no IE, presumo o mesmoundefined
, caso seja reatribuído de alguma forma posteriormente.A parte superior
window
desse script está apenas nomeando o argumento "janela", um argumento mais local que awindow
referência global e qual o código dentro deste fechamento usará. Owindow
final está realmente especificando o que passar para o primeiro argumento, neste caso, o significado atual dewindow
... a esperança é que você não tenha estragado tudowindow
antes que isso aconteça.Isso pode ser mais fácil de pensar, mostrando o caso mais comum usado no jQuery,
.noConflict()
manipulação de plug-ins , portanto, para a maioria do código você ainda pode usar$
, mesmo que isso signifique algo diferente dejQuery
fora deste escopo:fonte
Testado com 1000000 iterações. Esse tipo de localização não teve efeito no desempenho. Nem um único milissegundo em 1000000 iterações. Isso é simplesmente inútil.
fonte
window
lo, você poderá obter algum ganho por uma cópia local.