2012-03-09 17 views
5

Questa domanda riguarda Javascript nell'ASP classico. Non ha nulla a che fare con Javascript in esecuzione nei browser.Inserimento di oggetti in ambito globale in ASP/Javascript classico

Un costrutto tipico per un modulo JS che è stato progettato per essere riutilizzabili è così:

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

Questo consente al codice di essere sintatticamente incapsulato, per consentire controlli nel runtime parser/compilatore . Fornisce anche la gestione dell'ambito, in modo che le vars e le funzioni dichiarate all'interno dei ricci non siano visibili esternamente.

Un'altra costrutto tipico è quello di "esportazione" di un oggetto o una funzione appartenente alla portata interna, alla portata esterna, tramite assegnazione, in questo modo:

(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" 

Tutto questo è abbastanza tipico.

Quando si utilizza questo tipo di costrutto in ASP classico (attenzione: javascript sul lato server !!) il motore JS si alza. Ottengo un errore 500.

Perché?

Posso usare il costrutto dell'ambito e "esportare" le cose nello scope globale, nel classico ASP?

In un runtime del browser, "questo" restituisce "finestra". In un runtime ASP classico sul lato server, qual è il valore del "questo" globale? È possibile assegnare nuove proprietà a questo "questo"?

risposta

2

Non sono sicuro del tipo sottostante, ma sarà un oggetto COM. A meno che questo oggetto COM non implementi IDispatchEx non sarà in grado di assegnarvi proprietà arbitarie. Questo è il caso degli oggetti COM di MSHTML che sono alla base dell'implementazione DHTML di Internet Explorer. Tuttavia, sembra che ASP non abbia fornito la stessa funzionalità.

V'è un work-around supponendo che il parametro globalScope è veramente dovrebbe sempre e solo essere la portata globale:

(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 il avvertenza che la proprietà searchData non deve essere già presente ovunque la catena di portata. In questo caso, JScript lo creerà a livello globale.

Il nome searchData fa diventare un elemento denominato nello script attivo (vale a dire, se si dovesse includere anche qualche VBScript nella stessa pagina che VBScript può anche vedere searchData). Inoltre, ora è assegnato this.searchData. Sembrerebbe che qualunque sia l'oggetto globale è che consente la risoluzione tardiva dei nomi dei membri da associare agli oggetti denominati sull'oggetto Active Script stesso.

Problemi correlati