2011-03-04 20 views
8

Mis intentos de dar alcance global a una función de JavaScript anidada no están funcionando:JavaScript: ¿declara alcance global para la función anidada?

//DECLARE FUNCTION B IN GLOBAL SCOPE 
function B; 

function A() { 

    //DEFINE FUNCTION B INSIDE NEST 
    B() { 
     alert("function B is running"); 
    } 
} 

//CALL FUNCTION B FROM GLOBAL SCOPE 
B(); 

Esto es sólo curiosidad - Tiene razón en que yo realmente no tengo ninguna buena razón para querer hacer esto.

TIA - No tengo una cuenta para responder a sus respuestas ...

+1

No creo que se necesita una cuenta para comentar sobre las respuestas a su pregunta. –

+0

Siempre puede registrarse. No duele :) Como puedes ver, hay muchos usuarios muy destacados en Stackoverflow (es decir, Jon Skeet, Joel Spolsky, Jeff Atwood ...) –

Respuesta

13

function B; simplemente se generará un error de sintaxis.

Puede usar un function expression. A medida que las funciones son objetos de primera clase, se puede asignar una función a una variable:

var B; // declare (global) variable (outer scope) 

function A() { 
    // assign a function to it 
    B = function() { 
     alert("function B is running"); 
    }; 
} 

// we have to call A otherwise it won't work anyway 
A(); 
// call B 
B(); 

También podría dejar A retorno a una función:

function A() { 
    return function() { 
     alert("function B is running"); 
    }; 
} 

B = A(); 

Esto haría que la relación entre A y B un poco más claro.

Por supuesto, siempre puede definir una variable global omitiendo var, pero debe usar esto con mucho cuidado. Use como menos variables globales como sea posible.

function A() { 
    B = function() { 
     alert("function B is running"); 
    }; 
} 

Y apuesto a que hay una mejor manera de hacerlo, dependiendo de cuál sea su objetivo real.


More about Functions and function scope.

2

Usted puede hacer algo como esto:

function outer() { 
    function inner() { 
    // .. 
    } 

    window['inner'] = inner; 
} 

Es un poco repulsivo para tener una referencia directa a "ventana", por lo que podría hacer esto (por el contexto mundial):

(function (global) { 
    function inner() { 
    // code code code ... 
    } 

    global['inner'] = inner; 
})(this); 
0

Parece haber un par de problemas con su código

  1. La primera línea no parece ser legal Javascript (JSLint está de acuerdo). Para declarar un uso variable no inicializada la sintaxis var B;
  2. El código nunca llama de A a B de modo inicializar llamando B() se invoca una inicializar variables
  3. Estoy bastante seguro de que el código para inicializar B en el interior de A es también no es legal .

intente lo siguiente

var B; // Establish B as a global scope variable 

function A() { 
    B = function() { 
    alert('B is running'); 
    }; 
} 

A(); // Call the function which will cause B to be initialized 
B(); // Run B 
0

Estás cerca, pero no del todo correcta.

  1. Debe definir B como una variable y luego asignarle una función.
  2. También ejecute A() antes de ejecutar B, de lo contrario, B no estará definido. La forma más fácil de ejecutarlo es la forma en que lo muestro en mi ejemplo de código.

Estos son los menor cantidad de cambios a su código para que funcione como lo pidió:

var B; 

(function A() { 
    // define function B 
    B = function() { 
     alert("function B is running"); 
    } 
})(); 

// call function B globally 
B(); 
3

¿Qué hay de:

function A() { 
    window.B = function() { 
     alert("function B is running"); 
    } 
} 
//CALL FUNCTION B FROM GLOBAL SCOPE 
B(); 
Cuestiones relacionadas