Что нового

Непонятности с переменными

kyi

Новичок
Сообщения
43
Репутация
0
Добрый день!
Прочитал в документации различия между локальными (Local) и глобальными (Global) переменными
и решил провести эксперимент, что будет если использовать локальную переменную там где не должна она использоваться.
Думал, что получу ошибку, посмотрю как она выглядит, но у меня все работает.

Код:
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>


Local $test
Local $Button_Comp
Local $MMC

$test = GUICreate("test",350,350,-1,-1,-1,-1)
$Button_Comp = GUICtrlCreateButton("Мой текст",40,100,100,30,-1,-1)
GUISetState(@SW_SHOW,$test)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button_Comp
			$MMC = 'compmgmt.msc'
			RunMMC()
	EndSwitch
WEnd

Func RunMMC()
	ShellExecute(@SystemDir & '\MMC.EXE', $MMC)
EndFunc

Обратите внимание, переменная $MMC локальная, а значит (по книжке ) должна работать в пределах конкретной функции либо в пределах основного тела программы.
В основном теле программы я задаю локальную переменную $MMC = 'compmgmt.msc' по логике она не должна работать в функции, но работает.
Объясните мне пожалуйста, в чем я не прав ?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Посмотрите здесь

Если вы объявляете переменную в начале скрипта или за пределами любой функции, она создаётся, как глобальная (Global) переменная, и доступна из любого места скрипта.

Если вы объявляете переменную внутри функции, она создаётся, как локальная (Local) переменная, и доступна только в этой же самой функции. Переменные, созданные внутри функции, автоматически уничтожаются после окончания её работы.
 
Автор
K

kyi

Новичок
Сообщения
43
Репутация
0
Но подождите, я же специально указываю
Local $MMC, а не просто $MMC
 

hedji

Продвинутый
Сообщения
409
Репутация
94
В данном случае важнее вложенность функций.
Она как бы локальная для всего скрипта и глобальна для функций в скрипте.
Код:
Local $x=1

Func one()
	Local $x = 2
	Global $y = 3
	ConsoleWrite($x & @CRLF)
EndFunc

one() ;выведет 2
ConsoleWrite($x & @CRLF) ;выведет 1
ConsoleWrite($y & @CRLF) ;выведет 3
 
Верх