var global = "global";
var foo = function(a){
    eval(a);
}
foo("global = 'local'");
//不要添加var ,在函数内部使用var定义,就呗定义成局部变量了。
alert(global);

解决方案 »

  1.   

    不是这个意思,eval的上下文是什么。var 变量名在函数内就是局部的,如果这么理解,那eval执行return为什么又报错。
      

  2.   

    var foo = function(a){
        eval(a);
    }
    foo("var a = function(){return 2;}();alert(a);");
    //return是关键字,只能出现在function的内容部,
    //而eval传入的是一个字符串,如果你想要在eval传入的字符串中使用return,那么就必须有一个一个函数的字符串的形式,我这么理解。foo("alert(this)");
    //而且eval也没有什么上下文的概念吧?既然说到上下文,那么就要访问到eval的内部this属性,可是,eval的内部this,可以访问到吗?//或者说,像eval,alert,这些都是定义在window对象下的顶级函数,它们内部的this指向(也就是上下文),和定义在哪,是没有关系的,只和你怎么使用有关。//所以,这样定义一下,能理解吗?
    var b = {foo : foo};
    b.foo("alert(this)");
    //或者,使用自定义的方法:function aa(){
    alert(this);
    }//这里的this,就是指向window的
    aa();
    var bb = {
    aa:aa
    };bb.aa();
    //这里的this就是指向bb对象的。之前有总结过一点关于this指向东西,仅供参考:
    函数中this的指向-简单认识
      

  3.   

    似乎有点明白了灰常感谢。。好多年没来感觉csdn好冷清……
      

  4.   

    是啊,偶尔会写点东西~~正好,刚才也在想一些东西,顺便就供你参考一下吧,几个示例,虽然不能很全面的说明上下文的东西,但是如果能想明白,应该有些帮助吧:function getFunction(name){
    function getName(){
    return name;
    }
    return getName;
    }var a = getFunction("zhang"),
    b = getFunction("ling");

    console.log(a == b);   //?
    console.log(a());      //?
    console.log(b());      //?
    function bindFn(fn){
    return fn();
    }var name = "ling",
    obj = {
    name:"zhang",
    sayName:function(){
    return function(){
    return this.name;
    }
    }
    },
    sayName = obj.sayName;console.log(obj.sayName()());    //?
    console.log(sayName()());        //?
    console.log(sayName.call(obj)());//?

    var a = bindFn(obj.sayName),
    b = bindFn(sayName);

    console.log(a()); //?
    console.log(b()); //?
    function bindFn(fn){
    return fn();
    }var name = "ling",
    obj = {
    name:"zhang",
    sayName:function(){
    var name = this.name;
    return function(){
    return name;
    }
    }
    },
    sayName = obj.sayName;console.log(obj.sayName()());    //?
    console.log(sayName()());        //?
    console.log(sayName.call(obj)());//?

    var a = bindFn(obj.sayName),
    b = bindFn(sayName);

    console.log(a());  //?
    console.log(b());  //?
    只想了这么一点点,所以,有兴趣,可以试着看看~~