Strictly speaking, these are not distinct, since shell functions use the same scripting language as a script. Functions are handy when you want to re-use code, such as when you have a library of generic functions that you source in numerous other scripts. The system startup and configuration scripts for many distros use this technique.
Functions can be loaded and remain in the environment in your shell, ready for use when needed. I have a few of these that I load in my .bashrc file. One nice thing is that they are found by readline when I use the tab key for commandline completion.