environment function?

We all know environment variables.But when I type "set" in bash shell, I found not only environment variables but also this:

_alias () 
{ 
    local cur;
    COMPREPLY=();
    cur=${COMP_WORDS[$COMP_CWORD]};
    case "$COMP_LINE" in 
        *[^=])
            COMPREPLY=($( compgen -A alias -S '=' -- $cur ))
        ;;
        *=)
            COMPREPLY=("$( alias ${cur%=} 2>/dev/null |                         
     sed -e 's|^alias '$cur'\(.*\)$|\1|' )")
        ;;
    esac
}

When I type "type _alias" in shell, it said :_alias is a function.

my question:
1, what is this, where is it stored, and how to use this?
2, what are the differences of set, env, export and declare?

Thanks for your time.

It looks like it may be bash completion code. Have you checked your $HOME/.bashrc, $HOME/.profile and /etc/profile? Also sometimes completion code exists in /etc/bash_completion.d

Aparently bash also lists all functions with the environment variables. The POSIX man page for set indicates that only environment variables should be listed, but one set of bash documentation that I found indicates that the functions are also listed.

So, what you are seeing is a function defined to the shell. It is stored internally within the shell's address space. You could invoke it directly, but given that it is defined with a leading underbar (_alias) I'd guess it might not benefit you.

If you define a function

function foo
{
    echo "bar"
}

and run set again, you'll see your function there too. Executing foo at the command line will invoke your funciton.

Generally set is used to assign a list of tokens to the shell variables $1, $2... $n, however if no arguments are given, the environment is to be generated. The interpretation of what the environment is seems to differ between shells. Kshell generates a list of environment variables while bash seems to yield more.

The env command accepts one or more name=value pairs ahead of a command, places the tuples into the environment and then executes the command. Most modern shells do this without the need to invoke the env command.

The export command takes a shell variable and places it into the environment which is then available to any child process started from the shell.

I am unfamiliar with a declare command; C shell maybe?

Might be a useful reference:
http://ss64.com/bash/set.html