Razão por trás dessa variante de function anônima auto-invocadora

Enquanto observava o código no github, encontrei o seguinte:

(function() { }).call(this); 

Esta é claramente uma function anônima auto-invocadora. Mas por que está escrito dessa maneira? Estou acostumado a ver a variante canônica (function() {})() .

Existe alguma vantagem em particular ao usar .call(this) para uma function anônima auto-invocadora?


Edit: Parece que alguns ambientes commonjs configuram this para um valor não global no nível superior de um módulo. Quais e o que eles definem para que você queira preservar?

.call(this) (foi na verdade apenas () até que eu mudei) garante que seu nível superior seja consistente através do modo estrito, --bare option e / ou o ambiente em execução (onde o nível superior não aponta para o object global ).

Por padrão, invocar uma function como (function(){/*...*/})() irá definir o valor this na function para window (em um navegador) independente de qualquer que seja o valor this pode estar no contexto de inclusão em que a function foi criada.

Usar a call permite definir manualmente o valor this para o que você quiser. Neste caso, está configurando para qualquer valor que esteja no contexto de inclusão.

Veja este exemplo:

 var obj = { foo:'bar' }; (function() { alert( this.foo ); // "bar" }).call( obj ); 

http://jsfiddle.net/LWFAp/

Você pode ver que conseguimos definir manualmente o valor this para o object referenciado pela variável obj .

Usando:

 > (function() { > ... > }).call(this);` 

então isso no escopo do código (probaby o object global) é definido como o object da function. Tanto quanto eu posso dizer, é equivalente a:

 (function(global) { // global references the object passed in as *this* // probably the global object })(this); 

Em um navegador, geralmente window é (ou se comporta como se fosse) um alias para o object global.

 C={ descript: "I'm C!
", F: function() { //set this to the caller context's 'this' (function() { document.write(this.descript); }).call(this); //set this to 'window' or 'undefined' depend the mode (function() { document.write(this.descript); })(); //member function's 'this' is the object self document.write(this.descript); } } window.descript="I'm window!
"; CF();

(function() {}).call(this); poderia definir o this no contexto anônimo para o chamador this , em cima é C (function() {})(); irá definir this para window ou undefined depende do modo.

A function de auto-invocação é útil para executar seu conteúdo imediatamente quando o script é carregado. Isso é conveniente para inicializar elementos de escopo global.

    Intereting Posts