Function()动态定义的函数,变量作用域问题。
-----------------------------------------
以下代码,在tmp函数中定义了局部变量 a="local",但是在动态函数中输出,为何输出的却是全局变量的值呢?
  <script type="text/javascript">
var a="global"
function tmp() {
var a="local";
alert(a); var fn=Function("alert(a);")
//这个动态函数,作用域为何输出的是 全局变量的值呢?
fn();
}
tmp();
  </script>

解决方案 »

  1.   

    希望你能明白了~var a="global"
        function tmp() {
            var a="local";
            alert(a);
            var fn = function() {
    alert(a);
    };
    var fn = Function("alert(a)");
            //这个动态函数,作用域为何输出的是全局变量的值呢?
    alert(this.a);
            fn();
        }
        tmp();
      

  2.   

     var fn=Function("alert(a);");
    这种用法调用了Function类崭新创建了一个对象。而Function的上层是window。所以你在里面访问到的就是window下的全局变量。var fn = function() {}这种方法只是普通的函数定义。fn是其外层对象的一个成员,所以可以访问同属于外层对象的局域变量。
      

  3.   

    我明白了,动态函数输出this.a,但是为何在函数内,这个this,不是函数本身呢? <script type="text/javascript">
    var a="global"
        function tmp() {
            var a="local";
            alert(a);
    alert("this.a = "+this.a);
            var fn = function() {
                alert(a);
            };
            var fn = Function("alert(a)");
            //这个动态函数,作用域为何输出的是全局变量的值呢?
            
            fn();
        }
        tmp();
    </script>
      

  4.   

    以下代码更好看,为何 this.a不是local而是 global呢? <script type="text/javascript">
    var a="global"
        function tmp() {
            var a="local";
            alert(a);
    alert("this.a = "+this.a);
        }
        tmp();
    </script>
      

  5.   

    this.a 和 var a 可是两个东西。
    var a只是个局部变量而已。而this.a是外层对象的自定义属性。
    所以this.a 就是this.a ,而 var a 就是 a 。 <script type="text/javascript">
        var a="global"
        function tmp() {
            var a="local";
            this.a="local";
            alert(a);
            alert("this.a = "+this.a);
            var fn = function() {
                alert(a);
            };
    //        var fn = Function("alert(a)");
            //这个动态函数,作用域为何输出的是全局变量的值呢?
            fn();
        }
        tmp();
        </script>
      

  6.   

    这样更清楚
    var a = "global var "
    function tmp() {
    var a = "local var";
    this.a="this.a";
    alert(a);
    alert(this.a);
    var fn = function() {alert(a);}; //输出局域变量
    // var fn = Function("alert(a)"); //这个动态函数,作用域为何输出的是全局变量的值呢?
    fn();
    }
    tmp();