設定物件作用域

2021-05-21 17:31:57 字數 2762 閱讀 4183

設定物件作用域

物件的作用域決定哪些指令碼可以使用該物件。預設情況下,當您建立物件例項時,該物件具有頁作用域。同一 asp 頁中的任何指令碼命令都能使用該頁作用域的物件;當 asp 頁送回客戶端時,該物件即被釋放。對大多數物件來說,推薦的作用域是頁作用域。您可以改變乙個物件的作用域,使其可被其他頁的指令碼使用。本主題將解釋如何使用頁作用域的物件以及如何改變物件的作用域。

使用頁作用域物件

在 asp 頁上用 server.createobject 建立的物件在該頁的生存期內一直存在。該物件對該頁的任何指令碼命令都是可訪問的,當 asp 處理完該頁時,該物件即被釋放。因此,物件具有該頁的作用域或生命週期。

在用 visual basic 或 vbscript 程式設計時,要注意在 asp 處理完該頁之前不要釋放物件。例如,以下語句經常用於通過將物件變數賦以 nothing 值來釋放物件:

set myobj = nothing

如果您在 asp 頁中包含了該語句,那麼任何使用 myobj 的企圖都將會返回乙個預期的錯誤**。但在內部,即使在物件釋放以後,asp 仍保留對它的引用。當您在指令碼中不能使用物件時,物件的資源直到 asp 處理完頁之後才釋放。同樣,如果您通過建立另乙個物件例項並將其賦給已使用過的物件變數來釋放該物件時,asp 將保留對原物件例項的引用。對大多數指令碼來說,建立多個物件可能不會產生問題,但如果物件使用共享資源,比如資料庫連線,就有可能出現問題。

由於物件有頁作用域,所以不要依靠手工釋放的物件。例如,以下的迴圈建立 1001 個 connection 物件,它將能開啟大多數的連線甚至於乙個大型的 sql server:

<%

for i = 0 to 1000

set conn = server.createobject("adodb.connection")

conn.open "connection string"

next

%>

總的來說,應該盡量避免在乙個迴圈內部建立物件。如果無法避免,您應該手工釋放被物件使用過的資源。如果 connection 物件僅被建立一次,且資料資源的物理連線在每個迴圈中被開啟然後關閉,那麼上例將會正常執行:

<%

set conn = server.createobject("adodb.connection")

for i = 0 to 1000

conn.open "connection string"

conn.close

next

%>

為物件賦予會話作用域

在應用程式中,對於每個新會話,都會建立 session-scope 物件,並且在會話結束後會將其釋放。因此,每個活動的會話都有乙個物件。會話作用域用於從多個指令碼中呼叫的物件,但只影響乙個使用者會話。您可以只在需要時才為物件賦予會話作用域。如果確實需要使用會話作用域,那麼就必須了解提供物件的元件的執行緒模型,因為它影響效能和物件的安全環境。詳細資訊,請參閱本主題的「高階資訊:效能問題」 。

要為物件賦予會話作用域,請將物件儲存在 asp session 內建物件中,您既可以在 global.asa 檔案中使用 標記,也可以在 asp 頁上使用 server.createobject 方法建立具有會話作用域的物件例項。

在 global.asa 檔案中,您可用擴充套件了 runat 屬性(必須設定為 sever)和 scope 屬性(必須設定為 session)的 ;object> 標記。以下示例建立乙個 ad rotator 物件的會話作用域例項:

一旦您在 session 物件中儲存了物件,您就可以從應用程式的任何頁中訪問該物件。下面的語句使用上例中由 標記建立的物件例項:

<%= myad.getadvertisement("addata.txt") %>

在 asp 頁上,您也可以使用 server.createobject 方法將物件儲存在 session 內建物件中。以下示例在 session 物件中儲存 ad rotator 物件的乙個例項。

<% set session("myad") = server.createobject("mswc.adrotator") %>

要顯示廣告,您首先應該獲取儲存在 session 物件中的 ad rotator 物件的例項,然後才能呼叫方法來顯示物件:

<% set myad = session("myad") %>

<%= myad.getadvertisement("addata.txt") %>

在用 標記宣告的物件被某個 .asp 檔案中的指令碼命令引用之前,asp 並不建立其實例。server.createobject 方法則立即建立該物件例項。因此,對會話作用域物件來說,使用 標記要比 server.createobject 屬性更好。

會話和應用程式作用域的替代方案

僅當需要時,才能為物件賦予會話或應用程式作用域。因為在會話或應用程式結束執行之前,這些物件會一直保留。它們會占用記憶體或資料庫連線等資源,這些資源可能會在其他方面更有用。另外,元件的執行緒模型會影響您從中所建立的物件的效能,尤其是那些具有會話或應用程式作用域的物件。

使用者自定義的 jscript 物件

您可以通過定義乙個建立和初始化新物件的屬性和方法的建構函式來建立自己的 jscript 物件。當指令碼用 new 操作符來呼叫建構函式時,就會建立該物件的例項。asp 指令碼支援使用者自定義的物件,當具有頁作用域時,後者正常執行。但如果為使用者自定義的 jscript 物件賦予應用程式或會話作用域,將可能影響該物件的功能。特別是,若乙個物件具有會話或應用程式作用域,則其他頁的指令碼可以獲取該物件的屬性,但是卻不能呼叫其方法。

因為您可能不會始終控制所用物件的執行緒模型,所以,以下的指導可幫助您獲得最佳效能:

設定物件作用域

設定物件作用域 物件的作用域決定哪些指令碼可以使用該物件。預設情況下,當您建立物件例項時,該物件具有頁作用域。同一 asp 頁中的任何指令碼命令都能使用該頁作用域的物件 當 asp 頁送回客戶端時,該物件即被釋放。對大多數物件來說,推薦的作用域是頁作用域。您可以改變乙個物件的作用域,使其可被其他頁的...

作用域與物件

1.全域性作用域 全域性作用域是最大的作用域 在全域性作用域中定義的變數可以在任何地方使用 頁面開啟的時候,瀏覽器會自動給我們生成乙個全域性作用域 window 這個作用域會一直存在,直到頁面關閉就銷毀了 下面兩個變數都是存在在全域性作用域下面的,都是可以在任意地方使用的 var num 100 v...

函式物件 作用域

例項1 通過外部調取內部值 函式物件 作用域 打破函式呼叫層級,從外部調取內部函式的值 正常情況只能通過f1去呼叫裡面函式inner 的值 def f1 def inner print from inner inner f1 實現外部調取內部函式的輸出值 思路 先呼叫出內建函式實體地址,再通過實體地...