Javascript:调试由eval()和新函数()创建的代码

时间:2009-09-28 15:25:13

标签: javascript debugging eval private-members

我试图将私有var放入已存在的函数中,例如:

var AObject={
 get:function(s){
        return s.toLowerCase()+a;
    }    
}

function temp(){
    var a="A";
    var o={};
    eval("o.get="+AObject.get.toString());
    reurn o;
}

var bObject=temp();
BObject.get("B");    // "bA"
BObject.get();  /* error: s is undefined; but marked in line "return o;"
                    and not in "return s.toLowerCase()+a;"*/

我的目标是运行get()函数,由现有的AObject拥有,使用私有var ...我使用eval(或新函数)获取它,但不幸的是调试器将被破坏!

那么,有一种方法可以在不使用eval的情况下实现这一点,或者使用eval并保持调试器有用的方法吗?

6 个答案:

答案 0 :(得分:1)

调试器没有指向函数中的行的原因是,您调用的函数与AObject.get函数完全没有关系(就JavaScript而言)。 Eval无法知道定义函数的字符串来自何处。调试器指向您调用eval的行,因为这是定义函数的位置,但它显然是一行。

要回答你的问题,我认为没有办法避免使用eval(或函数,这可能更好),除非你可以在temp内移动函数定义,以便它关闭“a”或在get函数中添加“a”参数。

答案 1 :(得分:0)

如果您希望局部变量eval在克隆函数中可用,我认为使用a是唯一的选择。另外,我会尝试不同的调试器(Firefox上的Firebug?)

答案 2 :(得分:0)

function objectbuilder(a){
  return {
    get:function(s){
      return s.toLowerCase() + a;
    }
  };
}

function temp(){
  return objectBuilder("A");
}

var bObject=temp();
BObject.get("B");    // "bA"
BObject.get();

答案 3 :(得分:0)

@svinto

function temp(obj){
    var a="A";
    var o={};
    eval("o.get="+obj.get.toString());
    reurn o;
}

var myObj=temp({
    get:function(s){
        return s.toLowerCase()+a;
    }
});

myObject.get("B");   //bA

你现在明白了吗?

答案 4 :(得分:0)

你是不是想做这样的事情?

var AObject={
 get:function(s){
        return s.toLowerCase()+this.a;
    }    
}

function temp(){

    return {get:function(s){return AObject.get.call({a:"A"},s);}};

}

编辑:在他的评​​论之后;

你知道吗,你会做什么是非常错误的,它的作用只是因为eval改变了范围链,基本上你是这样做的:

function temp(obj){
    var a="A";
    var o={};

    o.get=function(s){
            return s.toLowerCase()+a;
    }

    return o;
}

因为a在一个闭包中,这将起作用,但你不是在调用真正的obj get函数,而是在创建另一个在temp中工作的函数;

但是,正如我在评论中所述,你不应该编写包含未声明变量的函数,而应该在函数中传递这个变量,就像svinto那样。

编辑:删除错误的代码。

答案 5 :(得分:0)

@kentaromiura

不,你的方式只是因为你把变量放在窗口范围内(全局......)

你的“this”键是“window”对象,所以当你这样做时

this.a="A"

就像做

window["a"]="A"

以这种方式成为全局变量

function temp(obj){
    var a="A";

    return (function(){
        this.a =a;
        var o={};    
        o.get=function(s){return obj.get.call(this,s)};    
        return o;
    })();

}

var myObject=temp({
    get:function(s){
        return s.toLowerCase()+a;
    }
});

alert(myObject.get("B"));   //bA
alert(a); //A

这不是一种解决方法,必须是私有的,而不是全局的。 如果我决定使用全局变量开始使用全局向量,我可以存储我的私有变量。 谢谢。