2010-09-30 45 views
9

Tôi có một câu hỏi về phạm vi biến trong VBScript. Tôi biết có các từ khóa sau đây (từ autoitscript.com): (! Trong trường hợp này nó reuses biến toàn cầu)Phạm vi biến trong các hàm VBScript

  1. Dim = phạm vi địa phương nếu tên biến không tồn tại trên toàn cầu
  2. toàn cầu = Forces tạo biến trong phạm vi toàn cầu
  3. = lực lượng địa phương tạo ra các biến trong phạm vi địa phương/Chức năng

Hãy tưởng tượng rằng tôi có .vbs tập tin sau đây:

Dim strPath 

strPath = "C:\folder" 

DisplayPath strPath 

Sub DisplayPath(strPath) 'Does this strPath get it's own local scope? 
    MsgBox strPath 
End Sub 

Trong hàm: DisplayPath(strPath), là strPath a địa phương biến? Hoặc chức năng/người đăng ký có quyền truy cập vào số strPath được xác định ở đầu phần chính của tập lệnh dưới dạng biến số toàn cầu không?

Ngoài ra, điểm của việc sử dụng một cách rõ ràng là sử dụng Dim so với chỉ xác định các biến khi tôi sử dụng chúng, điều này có thể bằng ngôn ngữ kịch bản?

Trả lời

20

strPath trong thủ tục DisplayPath sẽ là biến mới nhưng không phải vì lý do bạn mong đợi, có vấn đề nhỏ với mã của bạn sẽ làm mờ vấn đề.

Khi gọi thủ tục Sub cú pháp VBScript không bao gồm dấu ngoặc đơn. Ví dụ: -

Sub MyProc(Param1, Param2) 
    '' # Do stuff 
End Sub 

MyProc("Hello", "World") 

ở trên sẽ dẫn đến lỗi cú pháp. Nó phải được gọi là: -

MyProc "Hello", "World" 

Bây giờ khi chỉ có một tham số, lỗi cú pháp không xảy ra. Điều này là do việc sử dụng dấu ngoặc đơn khác là một phần của một biểu thức, ví dụ: '(a + b) * c'. Trong trường hợp của: -

DisplayPath(strPath) 

VBScript giải quyết các "khái niệm" (strPath) và vượt qua kết quả-DisplayPath. Kết quả của nó dẫn đến lưu trữ mới giữ kết quả biểu thức.

Had bạn gọi với

DisplayPath strPath 

không tạo mới.

Tuy nhiên những gì về vấn đề này: -

Sub DisplayPath(something) 
    MsgBox something 
End Sub 

Vẫn là không lưu trữ mới được phân bổ. something sẽ trỏ vào cùng một bộ nhớ mà strPath thực hiện.

Sửa

Đoạn code dưới đây hoạt động: -

Dim strPath 

strPath = "c:\folder" 

Display 


Sub Display() 
    MsgBox strPath 
End Sub 

Tờ khai strPath bên ngoài của một thủ tục làm cho nó có phạm vi toàn cầu.

Đến thời điểm sử dụng rõ ràng Dim điều gì sẽ xảy ra nếu đường chuyển nhượng ở trên trông như thế này?

strPath = "c:\folder" 

Một biến mới gọi là strPath sẽ đi vào sự tồn tại và strPath sẽ vẫn trống. Bạn nên luôn bắt đầu file VBScript của bạn với các dòng: -

Option Explicit 

Điều này sẽ buộc bạn phải rõ ràng Dim tất cả các biến được sử dụng và sẽ giúp bạn tiết kiệm giờ thời gian gỡ lỗi.

+1

rất hữu ích, +1, cảm ơn. Tôi vui vì bạn đã làm rõ sự khác biệt giữa việc truyền tham chiếu và truyền theo giá trị (và tạo bộ nhớ mới). Tuy nhiên, những gì tôi cũng muốn biết là nếu 'strPath' là toàn cục và có thể truy cập được bởi tất cả các hàm/subs trong kịch bản, ngay cả khi tôi không chuyển chúng thành các biến chức năng cục bộ. – JohnB

+1

@JohnB: Xem câu trả lời đã chỉnh sửa của tôi. – AnthonyWJones

+0

Tôi thấy điểm của bạn với lỗi đánh máy, cảm ơn! – JohnB