2010-09-30 13 views
9

Tengo una pregunta sobre el alcance de la variable en VBScript. Sé que hay las siguientes palabras clave (de autoitscript.com): (! En cuyo caso se vuelve a utilizar la variable global)Alcance de la variable en las funciones de VBScript

  1. Dim = ámbito local si el nombre de la variable no existe ya a nivel mundial
  2. Global creación = Fuerzas de la variable en el ámbito global
  3. = fuerzas locales creación de la variable en el ámbito local/Función

Imagínese que tengo el siguiente archivo .vbs:

Dim strPath 

strPath = "C:\folder" 

DisplayPath strPath 

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

En la función: DisplayPath(strPath), es un local de strPath variables ? ¿O las funciones/subs tienen acceso al strPath definido en la parte superior de la sección principal del script como una variable global?

Además, ¿para qué sirve explícitamente usar Dim en lugar de simplemente definir variables como las uso, lo que es posible en los lenguajes de scripting?

Respuesta

20

El strPath en el procedimiento DisplayPath será una nueva variable pero no por las razones que espera, hay un problema sutil con su código que nublará el problema.

Al llamar al procedimiento Sub, la sintaxis de VBScript no incluye paréntesis. Por ejemplo: -

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

MyProc("Hello", "World") 

lo anterior daría lugar a un error de sintaxis. Se debe llamar: -

MyProc "Hello", "World" 

Ahora cuando solo hay un parámetro, no se produce un error de sintaxis. Esto es porque otro uso de paréntesis es como parte de una expresión, p. '(a + b) * c'. En el caso de: -

DisplayPath(strPath) 

VBScript resuelve la "expresión" (strPath) y pasar el resultado -DisplayPath. Es este resultado que da lugar a un nuevo almacenamiento mantener el resultado de la expresión.

Had You llamada con

DisplayPath strPath 

ningún nuevo creado.

Sin embargo ¿qué pasa con esto: -

Sub DisplayPath(something) 
    MsgBox something 
End Sub 

Todavía no hay una nueva almacenamiento asignado. something apuntará a la misma memoria que strPath.

Editar

El código siguiente funciona: -

Dim strPath 

strPath = "c:\folder" 

Display 


Sub Display() 
    MsgBox strPath 
End Sub 

La declaración de strPath fuera de un procedimiento hace que tenga alcance mundial.

En cuanto al punto de usar explícitamente Dim, ¿qué pasaría si la línea de asignación anterior fuera así?

strPath = "c:\folder" 

una nueva variable llamada strPath vendría a la existencia y strPath permanecería vacía. Usted debe siempre comenzar sus archivos VBScript con la línea: -

Option Explicit 

Esto obligará a que explícitamente Dim todas las variables a utilizar y le ahorrará horas de tiempo de depuración.

+1

muy útil, +1, gracias. Me alegro de que hayas aclarado esa distinción entre pasar por referencia y pasar por valor (y crear nuevo almacenamiento). Sin embargo, lo que también quiero saber es si 'strPath' es global y accesible para todas las funciones/subs en el script, incluso si no las paso como variables de función local. – JohnB

+1

@JohnB: ver mi respuesta editada. – AnthonyWJones

+0

Veo tu punto con el error tipográfico, ¡gracias! – JohnB