<html>
    <title>匿名函数测试</title>
    <head>
      <script language="javascript" >
          var str1 = "{m1:1}";
          function test(){
              var f1 = new Function("return "+str1)();//返回的是对象{m1:1},相当于Function内部,执行了eval("return {m1:1}");
              //var f1 = new Function("return '"+str1+"';")();//这样应该就可以了
              alert("f1 = " + f1 );              var f2 = function(){return str1}();//返回的是字符串'{m1:1}'
              alert("f2 = " + f2);
              }
              
      </script>
    </head>
    
    <body>
        <input type="button" onclick="test()" value="test"/>
    </body>
</html>

解决方案 »

  1.   

    昨晚回到家,仔细琢磨了很多时间这段代码,终于想明白了,现在我自己回复,希望对大家能有所帮助,如果有不对的地方,请大家指出,我会在第一时间更正.<html>
    <title>匿名函数测试</title>
    <head>
      <script language="javascript" >
       var str1 = "{m:1}";
      
       function test(){
                // 1.Function 构造函数方式定义函数
       var f1 = new Function("return "+str1)();
       alert("f1 = " + f1); // 2.直接量方式定义函数
       var f2 = function(){return str1}();
       alert("f2 = " + f2);
      
       ;
       }
      </script>
    </head>

    <body>
    <input type="button" onclick="test()" value="test"/>
    </body>
    </html>
    // 2.直接量方式定义函数 就不说了,返回的值就是我们所期望的值,只要知道当在已定义的匿名函数后加()表示直接调用该函数就行了,在JS中 () 有特殊的意义--叫做"函数调用符",当然也可以给里面传参数,这个我就不啰嗦了.我们现在最主要看 1.    在1. 中 我们首先要知道,当使用Function() 构造函数定义的方法在每次调用之前要先编译一次.我们不妨把var f1 = new Function("return "+str1)();分成两步来看:
        (1) var f1 = new Function("return "+str1); 先看这段,我们后面没有加(),表示这仅仅是定义,并不调用,然后使用 alert(f1);告诉我,你看到了什么?应该是这样的:
    function anonymous(){
    return {m:1} ;
    }  ,这个其实就是进行编译过后的真正的函数,现在我们看一下return {m:1} ,这个给我们返回的是什么? 是不是一个对象,在JS中我们就通过 {attribute:value} 的形式来定义对像的,对吧?所以这条语句会返回一个对象.
    然后我们再在上句代码的末尾加上() ;来调用它,变为var f1 = new Function("return "+str1)();这个表示立即调用函数,并将最终的return 值返回,那这时f1就是一个纯的对象了!
      好,我的讲解完了,现在我们总结一下,这个Function()(也就是 1.)和函数直接量(也就是 2.)究竟都做了些什么?
    Function(): 先进行编译函数体中的内容,我们定义了str1 = "{m:1}" ,下面我写这样一条语句,大家看看是什么结果 var func_body = "return " + str1 ,结果就是 "return {m:1}",也许大家已经明白为什么使用Function() 的原因了吧 ,"它可以利用字符串连接把"{m:1}" 两边的引号去掉,从而转变成一条完整的语句 ,这个在Ajax中把服务器返回的数据转换成JSon对象是很有用的.
    函数直接量: 我们传过去的是什么,他返回的就是什么,因为他是预编译的.最后,再给大家补上一点,如果我把str1 的值变成 "123" ,那么Function()返回的是一个数值123 , typeof 是Number ,而函数直接量返回的是"123" ,typeof 是String.希望大家能想出一个在函数直接量中把str1 = "123" 两边双引号都去掉的方法,如果有哪位朋友想出来了,请回贴或直接和我交流,本人感激不尽如果大家看完我的这篇贴有所学习,请您回贴,因为这是我花了大约一个小时,辛辛苦苦写出来的这篇文章,您的鼓励是我最大的动力..... ^_^