想想,学1天了 ... 却还是问题不断 ... 首先请看这个代码<html>
<body>
<meta http-equiv="content-type" content="text/html;charset=GB2312" >
<script language="javascript">
<!--
var y = "global" ;
function fun(){
var y = "nihao" ;
return new Function("return y");
}
alert(fun());
-->
</script>
</body>
</html>结果如下 :这个结果,显然不是我想要的!!!于是,我将代码进行了一点点的改动,把alert(fun())改成了alert(fun()());结果,正确了,如下 :
由于初学JS才1天,不太理解这匿名函数的规矩,所以:问题1 : 请帮我解释下上面出现这情况的原因 ?问题2:麻烦各位解释下匿名函数的规矩!注:重点是解决 问题1  !!!
谢谢

解决方案 »

  1.   

    1,因为你alert的对象是个function,就像你alert一个对象一个,弹出的是个Object.
    2, 匿名函数,就声明的函数没有名字,
    像 var fn = function(){}; 这样就是把一个匿名函数赋值给了一个变量
    至于规矩,我不太清楚,这个也没声明特别规矩把,反正‘一些事情需要马上执行,不想声明一个函数,再调用,就可以用一个匿名函数
    如 $("#img_d").click(function (){alert()});就像这样, var v = 1; alert(v); 和 直接alert(1),看你喜欢那种,
     
      

  2.   


    首先来讲,你的回答很有帮助,谢谢你 !!!但是,我还是几个问题的,希望你能看看:请允许我把代码贴上:
    //累加器:闭包作为返回值
    function dwn(s)
    {
    document.write(s + "<br/>");
    }
    function add(a, b)
    {
    b = b || 0;
    document.write(b+"   ______   ");
    var s = a + b;
    //返回一个供进一步累加的闭包
    var ret = function(a){
    return add(a, s);
    }
    ret.valueOf = ret.toString = function(){
    return s;
    }
    document.write("<>++++++"+ret+"+++++<>");
    return ret;
    }
    dwn(add(5)); //5
    dwn(add(5)(10)); //15
    dwn(add(5)(10)(20)); //35
    dwn(add(5)(10)(20)(500)(500)); //35这个代码,是我在CSDN一个blog博主这里看过来的,我有2点不明白,希望你解释下:问题1:我感觉程序是死循环,因为程序没有控制何时结束...
    问题2:我注意到程序中有如下一段代码,我不解其意:
           ret.valueOf = ret.toString = function(){
    return s;
           }
    我尝试着去掉这段代码,则出现了问题,竟然输出了代码本身 !!!我又尝试着改写为:ret.valueOf = ret.toString = s ;
    这样写照错不误!!!
    我很是纠结,希望能指点我一下 ... 谢谢 ... 
      

  3.   

    1,怎么会是死循环呢?dwn(add(5)(10)(20)(500)(500)); 
    add(5)执行完,返回一个函数 (10)执行 直到 最后一个函数(500),这时返回一个函数,也就是dwn函数的参数,就执行完了。
                    var ret = function(a){
                        return add(a, s);
                    } 这个并不像是java的递归,它只是申明一个函数。
    2,       ret.valueOf = ret.toString = function(){
    return s;
           } 
    这里相当于java的重写toString()方法。如果你去掉这个代码,当然是输出那个函数本身。这个和你帖子一样。
    ret.valueOf = ret.toString = s ;这样的话,你把一个int型的 变量赋值给了一个函数,
    当然不行,ret.valueOf = ret.toString都是一个函数,你必须给它赋值一个函数
      

  4.   


    可是,我直接写 ret = s ; 也不行!!!
    可能是我对函数对象不理解吧 ... 能否指点下,我r =s 也不行的原因 ... 
      

  5.   

    ret也是个function啊,你用一个数字变量赋值给一个function,怎么能行?
      

  6.   

    建议楼主先找本书,系统地学完(重要地运行例子代码,不断地问自己问题),再看是不是需要问这些问题!
    还有,了解html文件,javascript执行顺序也同样很重要
      

  7.   

    不管什么语言,你起码要弄清楚new的目的是什么。公司招聘一个新人,和让新人干活,是两个步骤。招聘了新人,不一定就等于新人吧任务都完成了,你还要告诉他,去做什么,他才会返回结果。招聘的结果,是得到这个人,分配任务的结果,是得到你想要的结果。
    于是 new Function("return y")只是得到了这个一个函数对象,就是招聘到的人。
    return new Function("return y")返回的就是这个函数对象而已,但是它并没有执行。
    return (new Function("return y"))();
    这样把它作为一个函数对象 后面加()调用,也就是让其执行,才能达到效果。知其然,知其所以然,然后得道也。