解决方案 »

  1.   

    var data=[1,2,3,4,5];
    data.forEach(function(x){
    //forEach方法,不改变原有的数组
    //而这里的sum是属于局部作用域中的变量,
    //在该匿名函数外部,是没有办法访问的
    //那你如何能在外部访问到sum=55?
    var sum=0;
    sum+=x*x;
    return sum;
    });
    //console.log(sum);
    //因为在这里,sum所能访问的作用域,是没有定义sum变量的
    //所以,不能访问,会报错的。关于作用域链,有兴趣可以参考:浅析作用域链–JS基础核心之一,希望能对你有点帮助
      

  2.   

    我的问题就在于一楼我写的第一段代码(javascript权威指南)竟然可以打印出来'55',我觉得应该是打印出来'0'才对啊var sum=0;
    var data=[1,2,3,4,5];
    data.forEach(function(x){
      sum+=x*x;
    });
    console.log(sum);亲测可以打印出来'55',浏览器环境Firefox36.0.1
      

  3.   

    大大你好像没看清1L的第一段代码...sum变量是全局变量,初始化为0...
      

  4.   

    我整理了一下思路,这个问题是这样的:var sum=0;/*定义一个全局变量sum初始化为0*/
    var a=[1,2,3,4,5]; /*定义一个数组并初始化*/
    forEach(function(x){ /*将数组元素的值传递给x*/
    /*请注意!这是一个匿名函数!拥有其作用域!*/
     sum+=x*x; /*即使在函数体内不声明变量sum,我也可以直接拿过来使用*/
    });
    console.log(sum);/*问题在这里:为什么打印出来的不是全局变量sum的值:0,而是forEach()内匿名函数里的sum,按照'函数作用域'的定义:我在函数体外应该是访问不到匿名函数体内的变量*/这下问题应该清晰很多了
      

  5.   

    而是forEach()内匿名函数里的sum,
    ---第一段代码sum是再外部申明的,不是在匿名函数内部,forEach后当然访问的是上面申明的sum。。你自己写的那个代码,sum只能在匿名函数里面访问,外部无法访问。楼主多去补下变了作用域的知识
      

  6.   

    查了一下,还是再贴吧里的吧友回答了这个问题,问题关键在于"函数作用域"和"是否通过var声明变量"和"严格模式/非严格模式"。下面引自吧友“EVO3688”:还没有载入内存,运行计算以后就写入堆表里临时保留在内存里随时调用
    因为同名变量容易引污量,所以写变量的时候要小心
    规范的写法就是加var,形成局域作用,避免同名污染
    <script type="text/javascript">
    //fn()跑了一遍,8成了全局的值,全局变量覆盖了局部变量
    var x=5
    function fn(){
    x=8
    }
    fn() 
    document.write(x) //8
    //没有运行函数,没载入内存,还是调用原先的值
    var x=5
    function fn(){
    x=8
    }
    document.write(x) //5
    //函数加了var,只有在局域里发生作用,x还是5
    var x=5
    function fn(){
    var x=8
    }
    fn() 
    document.write(x) //5
    </script>
    简单的写了几个不是很详细,还是搜索下作用域和加不加var的区别文章
      

  7.   

    还有,版主你错了,”forEach后当然访问的是上面申明的sum“错的,访问结果不是“0”,而是“55”!