2012-03-09 40 views
5

此問題與傳統ASP中的Javascript有關。它與在瀏覽器中運行的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」評估爲「窗口」。在服務器端的經典ASP運行時,全局「this」的價值是什麼?是否可以將新屬性分配給該「this」?

回答

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,VBScript也可以看到searchData)。另外this.searchData現在被分配。看起來,無論全局對象是什麼,它都允許將成員名稱的後期解析映射到活動腳本對象本身的命名項。