# Keyword Reference

# Static

Declare a static variable or create a static array.

Static [Scope] $variable [ = initializer ]
Static [Scope] $aArray[subscript 1]...[subscript n] [ = initializer ]

## Parameters

Scope | An optional modifier, Local or Global that indicates where the variable is visible.
$variable | The name of the static variable to declare.
initializer | The value that will be initially assigned to the variable. The initializer can be a function call of involve mathematical or string operations. This initializer is only evaluated the first time this variable declaration is encountered.
subscript | The number of elements to create for the array dimension, indexed 0 to n-1.

## Remarks

The Static keyword can appear on the line before the optional scope specifier, or after. e.g. Local Static or Static Local are both acceptable.
If the scope specifier Local is used, then the static variable is visible and usable only in the function in which it is declared and it's resolved in the environment of execution (logical scope). This means that conditionally declared variable is visible only when declaration condition is met. If the scope specifier Global is used, then the static variable is visible and usable in all parts of the script; in this regard, a Global Static has very little difference from a Global variable. If the scope specifier is not used, then the static variable will be created in the local scope; in this way, Static is similar to Dim.
The difference between Local and Static is variable lifetime. Local variables are only stored while the function is called and are visible only within the function in which they are declared; when the function returns, all its local variables are released. Static variables are likewise visible only in the function in which they are declared, but they continue to exist, retaining their last value, after the function finishes execution. When looking for variables, the local scope is checked first and then the global scope second.
The Static keyword performs similar functions to the Global/Local/Dim keywords.

1. They all declare a variable before you use it.
2. They all can create an array.

Note: Static variables must be declared using the Static keyword prior to use, no matter how AutoItSetOption("MustDeclareVars") is set. Static variables can not be Const.
You can also declare multiple static variables on a single line:

Static $a, $b, $c

And initialize the variables:

Static $a = 2, $b = 10, $c = 20

When initializing a static variable, the initialization value is evaluated and assigned only the first time, when the variable is created. On all subsequent passes, the initializer is ignored.
See Local for more information about using arrays, which has all the same functionality as in Local, except for:

1. Reinitializing a Static variable has no effect.
2. You can not change a static variable to a local or global variable nor vice-versa.

If you want to resize an array use ReDim.

## Related

AutoItSetOption, Local, ReDim, UBound

## Example

### Example 1

    #include <MsgBoxConstants.au3>

    ; Call the Example function to initialize the Static variable in Local scope.
    Example()

    ; Call the Example function a second time to show that the variable has retained the data we last assigned to it.
    Example()

    Func Example()
        Local Static $sString = "This is a line of text which is declared using a Static variable in Local scope." & @CRLF & @CRLF & _
                "The variable $sString will now be visible to this function only and until the script closes."
        MsgBox($MB_SYSTEMMODAL, "", $sString)
        $sString = "If using just Local scope this string wouldn't be visible if this function was called multiple times, but since we're using the Static keyword" & @CRLF & _
                "the variable $sString will retain the data last assigned to it."
    EndFunc   ;==>Example

### Example 2

    #include <MsgBoxConstants.au3>

    Example()

    Func Example()
        SomeFunc() ; This will display a message box of 1, 1.
        SomeFunc() ; This will display a message box of 1, 2.
        SomeFunc() ; This will display a message box of 1, 3.
    EndFunc   ;==>Example

    Func SomeFunc()
        ; This initialises a Static variable in Local scope. When a variable is declared just in Local scope (within a Function,)
        ; it's destroyed when the Function ends/returns. This isn't the case for a Static variable. The variable can't be
        ; accessed from anywhere else in the script apart from the Function it was declared in.
        Local Static $vVariableThatIsStatic = 0
        Local $vVariableThatIsLocal = 0
        $vVariableThatIsLocal += 1 ; This will always be 1 as it was destroyed once returned from SomeFunc.
        $vVariableThatIsStatic += 1 ; This will increase by 1.
        MsgBox($MB_SYSTEMMODAL, $vVariableThatIsLocal, $vVariableThatIsStatic)
    EndFunc   ;==>SomeFunc