Вставка объектов в глобальную область видимости в классическом ASP / Javascript - PullRequest
5 голосов
/ 09 марта 2012

Этот вопрос относится к Javascript в классическом ASP. Это не имеет ничего общего с Javascript, работающим в браузерах.

Типичная конструкция для модуля JS, предназначенная для повторного использования, выглядит следующим образом:

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

Это позволяет синтаксически инкапсулировать код, чтобы разрешить проверки анализатором / компилятором во время выполнения. Он также обеспечивает управление областями, так что переменные и функции, объявленные в curlies, не будут видны извне.

Другой типичной конструкцией является «экспорт» объекта или функции, принадлежащих внутренней области, во внешнюю область с помощью присваивания, например:

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

Это все довольно типично.

При использовании такой конструкции в классическом ASP (внимание: серверный javascript !!) двигатель JS запускается. Я получаю 500 ошибок.

Почему?

Можно ли использовать концепцию определения объема и "экспортировать" вещи в глобальную область видимости в классическом ASP?

Во время выполнения браузера «this» оценивается как «window». Каково значение глобального "this" в классической среде исполнения ASP на стороне сервера? Можно ли назначить новые свойства этому «этому»?

1 Ответ

2 голосов
/ 09 марта 2012

Я не уверен, что является базовым типом, но это будет некоторый COM-объект.Если этот COM-объект не реализует IDispatchEx, вы не сможете назначить ему произвольные свойства.Это касается COM-объектов из MSHTML, которые лежат в основе реализации DHTML в Internet Explorer.Однако может показаться, что ASP не предоставляет такую ​​же функцию.

Существует обходное решение, предполагающее, что параметр globalScope, как ожидается, действительно когда-либо будет только глобальной областью действия:

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

С предостережением , что свойство searchData уже не должно присутствовать где-либо в цепочке областей действия.В этом случае JScript создаст его на глобальном уровне.

Имя searchData становится именованным элементом в активном скрипте (т. Е. Если бы вы также включили некоторый VBScript на той же странице, что и VBScriptсм searchData).Кроме того, this.searchData теперь назначен.Может показаться, что независимо от того, что это за глобальный объект, он разрешает сопоставление разрешенных имен членов с именованными элементами в самом объекте Active Script.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...