这个问题与经典 ASP 中的 Javascript 有关。它与浏览器中运行的 Javascript 无关。
设计为可重用的 JS 模块的典型构造如下:
(function(globalScope) {
... declarations here...
}(this));
这允许代码在语法上被封装,以允许运行时解析器/编译器进行检查。它还提供范围管理,以便在花括号内声明的变量和函数在外部不可见。
另一种典型的构造是通过赋值将属于内部作用域的对象或函数“导出”到外部作用域,如下所示:
(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 错误。
Why?
在经典 ASP 中,我可以使用作用域构造并将内容“导出”到全局作用域吗?
在浏览器运行时,“this”的计算结果为“window”。在服务器端经典 ASP 运行时中,全局“this”的值是什么?是否可以为“this”分配新属性?
我不确定底层类型是什么,但它将是一些 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.
随着caveat该财产searchData
不得已存在于作用域链上游的任何位置。在这种情况下,JScript 将在全局级别创建它。
名字searchData
确实成为活动脚本中的命名项(即,如果您还要在同一页面中包含一些 VBScript,VBScript 也可以看到searchData
)。此外this.searchData
现在已分配。看起来无论全局对象是什么,它都允许将成员名称的后期绑定解析映射到活动脚本对象本身的命名项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)