Each UNIX process has its own current directory. For instance, your shell has a current directory. So do vi, ls, sed, and every other UNIX process. When your shell starts a process running, that child process starts with the same current directory as its parent. So how does ls know which directory to list? It uses the current directory it inherited from its parent process, the shell:
ls...Listing of ls's current directory appears, which is the same current directory as the shell.
Each process can change its current directory and that won't change the current directory of other processes that are already running. So:
Your shell script (which runs in a separate process) can cd to another directory without affecting the shell that started it (the script doesn't need to cd back before it exits).
If you have more than one window or login session to the same computer, they probably run separate processes. So, they have independent current directories.
When you use aor a shell escape, you can cd anywhere you want. After you exit that shell, the parent shell's current directory won't have changed. For example, if you want to run a command in another directory without cding there first (and having to cd back), do it in a subshell:
When you really get down to it, what good is a current directory? Here it is: relative pathnames start at the current directory. Having a current directory means you can refer to a file by its relative pathname, like afile. Without a current directory and relative pathnames, you'd always have to use like /usr/joe/projects/alpha/afile.