2011-09-22 9 views

Respuesta

5

La función de auto invocación devuelve un objeto con la propiedad hi, este objeto no se añade al ámbito global, de modo que se puede utilizar directamente con el establecimiento. Poner el resultado de la función en una variable:

var o = 
(function(){ 

    var a = function(){ 
    alert("hey now!! "); 
    }; 

    return {"hi":function(){return a;}}; 

})(); 

Mediante la propiedad de llamar a la función sólo devolverá la función contenida en la variable a, por lo que tiene que llamar el valor de retorno de la función de llamar a la función que contiene la alerta:

o.hi()(); 

demostración: http://jsfiddle.net/Guffa/9twaH/

0
var obj = (function(){ 

var a= function(){ 
    alert("hey now!! "); 
}; 

return {"hi":function(){return a;}}; 

})(); 

obj.hi() 
+0

reemplazar "return a;" con solo "a" y funcionará. –

0

tiene que asignar el valor de retorno de la función anónima a una variable en el ámbito actual:

var f = (function() { 
    var a = function() { 
     alert("hey now!! "); 
    }; 
    return { 
     "hi": function() { return a; } 
    }; 
})(); 
f.hi()(); 
3

Hay dos formas básicas:

var MyNameSpace = (function(){ 

    function a(){ 
     alert("hey now!! "); 
    }; 

    return {a: a}; 

})(); 

MyNameSpace.a(); 

o

(function(){ 

    function a(){ 
     alert("hey now!! "); 
    }; 

    MyNameSpace = {a: a}; 

})(); 

MyNameSpace.a(); 

Yo prefiero la segunda forma, ya que parece más limpio

Se llama el "patrón de módulo revelador" por cierto , que puede leer para entenderlo mejor :)

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript

+1

Tenga en cuenta que la segunda forma crea una variable global, mientras que la primera forma crea una variable en cualquier ámbito circundante (puede ser global o no). – nnnnnn

+0

Eso es verdad. El ejemplo fue un poco limitado. Normalmente creo una variable global como un espacio de nombres de nivel superior y la construyo para minimizar la contaminación DOM –

+0

¿jQuery usa el segundo para exponer su método '$' al alcance global, porque cuando miro el código fuente no se ve como el primero? – John

0

It?

(function(){ 
    var a = function() { 
    alert("hey now!! "); 
    }; 
    return {"hi":function(){return a;}}; 
})().hi()(); 
0

supongo que con el fin de exponer la función, en lugar de su código, la sintaxis debe ser

var obj2 = (function(){ 

    var a= function(){ 
     alert("hey now!! "); 
    }; 

return {"hi":a}; 

})(); 

alert(obj2.hi()); 
0

O usted podría envolver su función 'hola' en un IIFE así ...

var myFunction = (function(){ 
    var a = function() { 
    alert("hey now!! "); 
    }; 
    return { 
     "hi": (function(){ 
      return a; 
     }()) 
    }; 

})(); 

myFunction.hi(); 
Cuestiones relacionadas