Actually, I found out something quite odd/interesting/etc. the other day:
Yes, variable with underscore is local in a script, BUT if you call a function from that script and in that function use same local variable that exists in the .sqs script, it passes to the function if it is not in the private array...
For example:
#loop
~1
? blah in _duh: [_blah] call func
_i = _i + 1
? _i == _blah2: goto "loop"
Then , in the func:
private["_vuf","_dud","_result];
_vuf = _this select 0;
while "_i < count _vuf"
do
{
_dud = _vuf;
};
_result
You can use the same variable (in this case _i) in the .sqs and in the .sqf which the .sqs calls... It seems that the function the .sqs calls exist in the same scope with that .sqs script...
So, if the variable _i has a value 3 in the .sqs the same variable _i used in the .sqf without adding it to the private array has also the value of 3... And you don't need to pass it to the function separately...
Not fully tested, but seems to be this way...
With this, you can also use other local variables than _x in init fields, triggers etc...
The local variable used in the global space needs to defined as not being private before using it, and afaik can only be used when calling functions...
As for the command private, I've only seen it used in functions and probably just because of the things I explained above...