2012-04-17 41 views
6
supposedlyGlobalVariable := "blah" 

ARoutine() 
{ 
    localVariable := "asdf" 
    MsgBox, The global variable value is %supposedlyGlobalVariable%. The local variable value is %localVariable%. 
} 


^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine 
ARoutine() 
return 

Run mã và kết quả là:biến toàn cầu không có phạm vi toàn cầu

"The global variable value is . The local variable value is asdf." 

Các documentation trạng thái:

phạm vi biến và tuyên bố: Với ngoại lệ của địa phương biến trong các hàm, tất cả các biến đều là toàn cầu; tức là, nội dung của chúng có thể là được đọc hoặc thay đổi bởi bất kỳ phần nào của tập lệnh này.

Tại sao biến toàn cục của tôi không có phạm vi trong hàm?

Trả lời

9

Các tài liệu cho các biến toàn cục có thể được tìm thấy ở đây:
https://autohotkey.com/docs/Functions.htm#Global

biến toàn cầu

Để tham khảo một biến toàn cầu hiện bên trong một hàm (hoặc tạo một mới một), khai báo biến này là toàn cục trước khi sử dụng nó. Đối với dụ:

LogToFile(TextToLog) 
{ 
    global LogFileName 
    FileAppend, %TextToLog%`n, %LogFileName% 
} 

Tôi tin rằng các khái niệm về toàn cầu, với AHK, là một chút khác biệt so với các ngôn ngữ khác. Với AHK, bạn có thể tạo một biến và sử dụng nó trong nhiều phím nóng và các chương trình con, mà không khai báo nó là toàn cục.

Gv := 0 

f1::SetTimer, Action, % (on:=!on) ? (1000) : ("Off") 

Action: 
    Gv++ 
    trayTip,, % Gv 
Return 

f2::Msgbox, % Gv 

Giải thích mã:

  • Các F1 chính Toggles một bộ đếm thời gian để chạy các chương trình con: Action mỗi 1000 ms.
  • % bắt đầu một biểu thức.
  • on:=!on đảo ngược giá trị nhị phân của biến on mỗi lần F1 được nhấn.
  • ?: cùng nhau được gọi là toán tử bậc ba.
  • Khi on = 1 delay được đặt thành 1000 ms; khi bật = 0 bộ hẹn giờ được bật Off.

Nhà điều hành ++ thêm 1 vào biến Gv.

+0

Điều này phản trực giác. Nếu một biến là toàn cầu, nhưng không phải bên trong một hàm ... thì nó ở đâu toàn cục mà không đòi hỏi một công cụ sửa đổi? –

+0

@ P.Brian.Mackey Tôi đã cập nhật câu trả lời của tôi trong một nỗ lực để giải quyết bình luận của bạn. –

0

P.Brian, Nó hoạt động khi bạn làm điều này .. Tôi biết nó không giải thích tại sao, nhưng điều này có thể là cách giải quyết của bạn.

#Persistent 
GlobalVariable = "blah" 
RETURN 

ARoutine: 
{ 
    localVariable := "asdf" 
    MsgBox, The global variable value is %GlobalVariable%. The local variable value is %localVariable%. 
} 
Return 

^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine 
gosub, ARoutine 
return 
Các vấn đề liên quan