我试图将私有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并保持调试器有用的方法吗?
答案 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)
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
这不是一种解决方法,必须是私有的,而不是全局的。 如果我决定使用全局变量开始使用全局向量,我可以存储我的私有变量。 谢谢。