2012-03-09 15 views
5

Esta pregunta se refiere a Javascript en ASP clásico. No tiene nada que ver con Javascript corriendo en navegadores.Insertar objetos en el alcance global en ASP/Javascript clásico

Una construcción típica de un módulo de JS que está diseñado para ser re-utilizable es de esta manera:

(function(globalScope) { 
    ... declarations here... 
}(this)); 

Esto permite que el código a encapsular sintácticamente, para permitir el control por el tiempo de ejecución analizador/compilador . También proporciona administración de alcance, por lo que los vars y las funciones declaradas dentro de los curlies no serán visibles externamente.

Otra construcción típica es la de "exportación" un objeto o función pertenece al alcance interior, con el ámbito exterior, a través de la asignación, como este:

(function(globalScope) { 
    var data = ['Alpha', 'Beta', 'Gamma']; 

    function helper(a) { .... } 

    function search(d) { .... } 

    // "export" a function so it is externally visible 
    globalScope.searchData = search; 

}(this)); 

// typeof this.searchData == "function" 
// typeof this.data == "undefined" 
// typeof this.helper == "undefined" 
// typeof this.search == "undefined" 

Todo esto es bastante típico.

Al utilizar este tipo de constructo en el clásico ASP (atención: ¡javascript del lado del servidor!) El motor JS se lanza. Recibo un error de 500.

¿Por qué?

¿Puedo usar la construcción de scoping y "exportar" cosas al alcance global, en ASP clásico?

En el tiempo de ejecución de un navegador, "esto" se evalúa como "ventana". En un tiempo de ejecución ASP clásico del lado del servidor, ¿cuál es el valor del "esto" global? ¿Es posible asignar nuevas propiedades a ese "esto"?

Respuesta

2

No estoy seguro de cuál es el tipo subyacente, pero será un objeto COM. A menos que este objeto COM implemente IDispatchEx, no podrá asignarle propiedades arbitrarias. Este es el caso de los objetos COM de MSHTML que subyacen a la implementación DHTML de Internet Explorer. Sin embargo, parece que ASP no ha proporcionado la misma característica.

No es un trabajo en torno suponiendo que el parámetro globalScope se espera verdaderamente que sólo ha de ser el alcance mundial:

(function() { 
    var data = ['Alpha', 'Beta', 'Gamma']; 

    function helper(a) { .... } 

    function search(d) { .... } 

    // "export" a function so it is externally visible 
    searchData = search; 

})(); // Please not also small syntatic correction of your original code. 

Con la salvedad que la propiedad searchData no debe ya estar presente en cualquier lugar hasta el cadena de alcance En este caso, JScript lo creará a nivel global.

El nombre searchData se convierte en un elemento con nombre en el script activo (es decir, si también incluyese algunos VBScript en la misma página que VBScript también puede ver searchData). Además, ahora se ha asignado this.searchData. Parecería que sea cual sea el objeto global, permite que la resolución encuadernada tardía de los nombres de los miembros se asigne a elementos con nombre en el objeto Active Script en sí.

Cuestiones relacionadas