<script type="text/javascript"> 
function make_counter(){
   count = 0;

 function inc_count(){
  count = count + 1;
  return count;
 }
 
 return inc_count;
}
 
c1 = make_counter();
c2 = make_counter();
alert(c1());
alert(c2());
  </script> 为什么这段代码中的C1,与C2输出不一样呢? 希望从栈,临时变量,闭包的角度去解释。
谢谢 。

解决方案 »

  1.   

    count没有声明,就作为全局变量处理了  
    改成 var count = 0; 就一样了
      

  2.   

    经测试, 改成var 就一样了。
    楼上各位说的是正确的,可是为什么会这样呢? 如何理解这个问题呢?
      

  3.   

    微软的官方文档中这样描述:If you do not initialize your variable in the var statement, it automatically takes on the JScript value undefined. Although it is unsafe to do so, it is legal JScript syntax to omit the var keyword from your declaration statement. When you do, the JScript interpreter gives the variable global scope visibility. When you declare a variable at the procedure level though, you do not want it to be visible at the global scope; in this case, you must use the var keyword in your variable declaration.
      

  4.   

    楼主要明白这个就需要明白JS的变量的命名规则:
    在函数中定义变量时,没写  var  则是全局变量。function make_counter() {
    count = 0;//当第一次调用时,count变成值为0的全局变量 function inc_count() {
    count = count + 1;
    return count;
    } return inc_count;
    }c1 = make_counter();//第一次调用后全局变量count值增1为1,
    c2 = make_counter();//第二次调用全局变量count值增1为2
    alert(c1());
    alert(c2());//代码相当于:
    var count = 0;//全局变量
    function make_counter() {
    function inc_count() {
    count = count + 1;
    return count;
    } return inc_count;
    }c1 = make_counter();//第一次调用后全局变量count值增1为1,
    c2 = make_counter();//第二次调用全局变量count值增1为2
    alert(c1());
    alert(c2());//如果要值不变应该改成:
    function make_counter() {
    var count = 0;//局部变量
    function inc_count() {
    count = count + 1;
    return count;
    } return inc_count;
    }c1 = make_counter();//第一次调用后局部变量count值增1为1,
    c2 = make_counter();//第二次调用后局部变量count值增1为1
    alert(c1());
    alert(c2());
      

  5.   

    在函数中定义变量时,没写  var  则是全局变量
      

  6.   

    哎,
    原来不加var就是全局的,