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