这个问题与经典ASP中的Javascript有关。它与在浏览器中运行的Javascript无关。
JS模块的典型构造可以重复使用,如下所示:
(function(globalScope) {
... declarations here...
}(this));
这允许在语法上封装代码,以允许运行时解析器/编译器进行检查。它还提供范围管理,以便在curlies中声明的vars和函数在外部不可见。
另一个典型的构造是通过赋值将属于内部作用域的对象或函数“导出”到外部作用域,如下所示:
(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”。在服务器端的经典ASP运行时,全局“this”的价值是多少?是否可以为“this”分配新属性?
答案 0 :(得分:2)
我不确定底层类型是什么,但它将是一些COM对象。除非此COM对象实现IDispatchEx
,否则您将无法为其分配任意属性。这是来自MSHTML的COM对象的情况,它是Internet Explorer的DHTML实现的基础。但是,似乎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也可以看到searchData
的同一页面中包含一些VBScript)。此外,现在已分配this.searchData
。似乎无论全局对象是什么,它都允许将成员名称的后期绑定解析映射到Active Script对象本身上的命名项。