我的运行结果
1 funcA('prjInfDiv', aFunc); 
弹出了一个方法的框2 try{
里面弹出了异常信息3 然后鼠标点击 XXXX,弹出了 123一切都很正常,不知道你的问题是什么???

解决方案 »

  1.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Insert title here </title> 
    </head> 
    <body> 
    <div id="prjInfDiv">xxxxxx </div> 
    </body> <script type="text/javascript"> 
    var funcA = function(param1, param2){ 
    alert('[' + param1 + ' ¦' + param2 + ']'); 
    document.getElementById(param1).onclick=function(){ 
    param2(); //这里使用的是你传递进来的参数,然后绑定新事件,浏览器会记住你注册的事件
    }; 
    } var aFunc = function(){alert(123)}; 
    funcA('prjInfDiv', aFunc); try{ 
    alert(param2 == undefined); //你这里param2没在window的区域内定义过,当然会出错
    }catch(e){alert(e + ' ' + e.message + ' ' + e.name + '\n' + e.stack)} 
    </script> 
    </html> 
    </script> 
    </html> 
      

  2.   

    呵呵,根本原因在于js的闭包特性。java方法执行完,其中的局部变量全部销毁内存被回收。js则可在函数中继续保持局部变量(包括函数)的状态。
    1、js是具有函数式语言特性,在函数内可以保存内部数据(包括局部变量、内部函数)的状态。
    2、命令式语言(如java,c++)则不然,函数内部的私有变量(局部变量)是不能被保存的。局部变量在栈上分配,在函数执行结束后,所占用的     栈被释放。举个例子
    var set,get;
    function fun() {
       var value = 10;
       
       function setValue(v) {
           value = v;
       }    function getValue() {
           return value;
       }   set = setValue;
       get = getValue;
    }//测试1,在函数fun执行结束后,内部数据值仍然保持它的状态。
    fun();
    alert(get());
    //测试2,set将影响内部数据值,影响后的状态仍然被保持。
    set(30);
    alert(get());
      

  3.   

    受教了zhouruitao,那么如果内部变量使用一个很大的字符串,例如将document.write的字符串传到内部函数,将也会被函数内部保持住,占用JS内存了。呵呵
      

  4.   


    你说的“很大的字符串”不存在问题,只要能及时回收。的确,
    1、js在方法内保持数据状态的特性即有好处也有坏处。坏处就是内存溢出的危险。和低级语言相比(如c就要求程序员精确的分配内存和进行回收)js使用众所周知的垃圾回收来管理自己的内存。js有个引用统计系统能够帮助统计程序使用内存的情况,当引用数为0时便进行内存回收。而引用之间相互引用会造成引用数永远不会为0,即这块内存永远不会被回收。最终导致内存泄漏。2、而闭包可能会不经意的引起引用循环。因为函数也是放在内存中的对象,任何在函数的闭包环境中的变量也都保存在内存中。