<script type="text/javascript"> 
    var y = "global"; 
    function factory() { 
      var y = "local"; 
      return function(){return y;}; //第5行
      //return new Function ("return y");//第6行
    }
    alert(factory()());
</script>
---------------------------------------------
上述代码会输出:local
如果把第5行注释掉,把第6行放开,那么输出:global
我想问问这是什么原因?这里有没有闭包的概念在里面?这两种
方式返回的都是匿名函数,它们的区别在哪里?请
各位大虾解答一下,谢谢!

解决方案 »

  1.   

        var y = "global"; 
        function factory() { 
          var y = "local"; 
          return function(){return y;}; //第5行 
          //return new Function ("return y");//第6行 
        } 
        alert(factory()());
    呵呵,第五行的确是闭包,匿名函数引用可了 factory 的局部变量 y,因此“local”得以显示!
    再说第六行,跟闭包没有一毛钱关系,new Function ("return y") 只是函数的一种实例化方式,
    "return y" 定义了方法体的内容,但只有在执行时才被解释,定义时并不检查,
    return 后被外层得到,并被 alert(factory()()) 执行,此时找到的 y 就是“global”!Function 标准实例化方式如下:
    var functionName = new Function("argument 1",..."argument n", 
    "statements for function body");
      

  2.   

    好意思,经试验发现俺上面的解释有些错误!
        var y = "global"; 
        function factory() { 
          var y = "local"; 
          //return function(){return y;}; //第5行 
          return (new Function ("return y"))();//第6行 
        } 
        alert(factory()); // global
    以上代码显示 global,这个结果说明经 new Function 实例化的函数为全局函数,
    其中的变量自然要从同级的作用域中查找,因此显示了全局 y 的 global。顺便说句,lz 是有心人,这个问题俺以前真没注意过,
    js 确实比较诡异,许多问题要通过试验来验证。
      

  3.   

    呵呵,函数有三种写法,你知道么?用Function()构造函数创建的函数不遵循典型的作用域,以顶级函数执行。 
      

  4.   

    通过调用 Function 构造函数创建的函数对象,其内部的 [[scope]] 属性引用的作用域链中始终只包含全局对象。通过函数声明或函数表达式创建的函数对象,其内部的 [[scope]] 属性引用的则是创建它们的执行环境的作用域链。
      

  5.   

    貌似有这些写法:var methodA = function() {
    //
    }function methodB(){
    //
    }
    引1楼:
    var functionName = new Function("argument 1",..."argument n", 
    "statements for function body");引5楼:
    通过调用 Function 构造函数创建的函数对象,其内部的 [[scope]] 属性引用的作用域链中始终只包含全局对象。 通过函数声明或函数表达式创建的函数对象,其内部的 [[scope]] 属性引用的则是创建它们的执行环境的作用域链。在这里其实lz把第二个var y = "local"; 改为var x = "local"; 更能说明问题一点:
    1、return function(){return x;}; 使用了闭包因为它能取得factory里面的x;
    2、return new Function ("return x") 会报错,因为没有全局x变量。
      

  6.   


    呵呵,是挺害人的,我做web那会,有一次就因为这个问题,卡了1整天
      

  7.   

    javascript确实很困挠人,要学会闭包和scope需要慢慢理解
    js的作用域是在定义时就确定了的,和执行没关系,更多的问题可以google很多的