关于js的匿名函数的有关问题

关于js的匿名函数的问题
        function test()
        {
            alert("ha ha ,ni mei !");
            return function () { alert(" you shi ni mei a "); };
        }

        window.onload = function ()
        {
            document.getElementById("btn").onclick = test();
        }

此时当页面加载的时候页面会弹出"ha ha ,ni mei !";

但是当

        window.onload = function ()
        {
            document.getElementById("btn").onclick =function()
             {
               alert("ha ha ,ni mei !");
            return function () { alert(" you shi ni mei a "); };
               } ;
        }

这样就不会在页面加载的时候弹出"ha ha ,ni mei !";
为什么?
------解决方案--------------------
function test()
        {
            alert("ha ha ,ni mei !");
            return function () { alert(" you shi ni mei a "); };
        }

        window.onload = function ()
        {
            document.getElementById("btn").onclick = test();
        }

此时当页面加载的时候页面会弹出"ha ha ,ni mei !";
上面这个页面加载时就执行test(),所以会弹出。。

 window.onload = function ()
        {
            document.getElementById("btn").onclick =function()
             {
               alert("ha ha ,ni mei !");
            return function () { alert(" you shi ni mei a "); };
               } ;
        }
这个页面加载时会给id为btn的元素(比如button)绑定点击事件,只有在点击btn时才会弹出ha ha ,ni mei !

------解决方案--------------------
引用:
我看的书上说的是 

btn.onclick=test();
和btn.onclick=function()
{
   里面的内容和test()里面的一样
}

这两种方法是一样吗?

=test();
这个得到的是test函数的返回值
=function(){}
这儿得到的是一个函数引用
你可以写=test,但不应该写=test()
建议补基础,不只是js的,函数()表示执行函数并获得返回值,这算各语言的通用规则了