Well, yes, the Ctrl+Space works with a script that contains no functions. But consider this: if the SCRIPT file contains a function, the FUNCTIONS parameters aren't exposed until the function is loaded into the session. Thus, the need to use dot-sourcing unless it's you intention to use the function in the current PowerShell session.
But if your intention is to run a script and not pollute your PowerShell sessions memory with functions that make no sense to retain (e.g., they specific the script in which they reside and are of no use outside the script), then you don't dot-source the script.
#This using the file Get-TestBBB which contains a function
#
#
# When run as a script (without dot-sourcing), the parameter is passed,
# but within the script the function Get-TestBBB is invoked with no parameter.
# The result? The default value of the Test parameter (an empty string)
# is used.
PS C:\junk> .\get-testbbb.ps1 -Test "Blah"
It doesn't work
PS C:\junk>
# The same thing happens because the function is invoked with no value
# from within the ps1 file.
PS C:\junk> . .\get-testbbb.ps1 -Test "Blah"
It doesn't work
# But NOW, becasue the script was dot-sourced, the funtion Get-TestBBB
# is preserved in this session's "memory"
PS C:\junk> gci function:get-*
CommandType Name Version Source
----------- ---- ------- ------
Function Get-Verb
Function Get-FileHash 3.1.0.0 Microsoft.PowerShell.Utility
Function Get-TestBBB
# NOW, we only have to invoke the function. The function invokation WITHIN
# the script isn't part of the function.
PS C:\junk> get-testbbb -test "It Works!"
It Works!
# And, so does Ctrl+Space
PS C:\junk> get-testbbb -Test
Test Debug WarningAction ErrorVariable InformationVariable OutBuffer
Verbose ErrorAction InformationAction WarningVariable OutVariable PipelineVariable
[string] Test