2011-10-22 116 views
0

我在使用setTimeout将对象传递给函数时遇到了麻烦;是否可以将对象传递给eval/setTimeout函数?

function alertObject(obj){ 
    alert(obj); //This is supposed to display "[object Object]" 
} 

function startCountdown(){ 
    var myObj = new myClass(); 
    setTimeout("alertObject("+ myObj +")",1000); 
} 

startCountdown(); 

当我运行这个,我得到一个错误,说“意外的标识符”。我知道我可以使用这样的匿名函数;

setTimeout(function(){alertObject(myObj)},1000); 

而不是

setTimeout("alertObject("+ myObj +")",1000); 

但事实是我想知道为什么你不能使用eval()函数传递一个对象。它的工作原理与弦...

回答

2

你不能序列化的对象,同时保持该对象的身份。 (不限于JavaScript)。

'alertObject('+myObj+')'涉及将对象转为与toString()的字符串,从而产生alertObject([object Object]),这显然是无效的JavaScript。

您可以提供toString()实现,它返回的东西是有效的JavaScript,并用它来创建一个新的对象,它是原来的对象:

function myClass(num) { 
    this.num= num; 
} 
myClass.prototype.toString= function() { 
    return 'new myClass('+this.num+')'; 
}; 

var a= new myClass(3); 
var b= eval(''+a);  // 'new myClass(3)' 
alert(a.num===b.num); // true 

,但它是不是同一个对象例如:

alert(a===b); // false 

,有没有办法让实际的原始对象,短的,例如,保持对象的每个实例的查找,并通过一键即查找。

字符串中的隐藏代码很糟糕。这是你不应该使用setTimeout和字符串参数的原因之一。与传递函数对象中去

0
setTimeout("alertObject("+ myObj +")",1000); 

相同

setTimeout("alertObject("+ ..object converted to string.. +")",1000); 

就是

setTimeout("alertObject([object Object])",1000); 

"alertObject([object Object])" 

不是有效的JavaScript,因此错误信息。

0

这是因为对象只存在于函数内部。

setTimeout中的回调代码将在全局范围内调用(即window),而不是函数的作用域。由于myObj是函数内部的局部变量,因此它在全局范围内不可用。

如果您在全局范围内声明变量,它将在您的函数结束时继续存在,并且可以从回调代码访问该变量。

请注意,您应该在代码中使用变量的名称,而不是将变量的值连接到字符串中。如果你这样做,你最终会得到类似"alertObject([Objecct object])"的东西,这当然不能运行。

var myObj; 
function startCountdown(){ 
    myObj = new myClass(); 
    setTimeout("alertObject(myObj)",1000); 
} 
0

你可以写这样的:

setTimeout(alertObject,1000,myObj); 

或像这样:

setTimeout("alertObject(myObj)",1000); 

在您的例子MyObj中是序列化到"alertObject([Objecct object])"哪些不能跑。

0
setTimeout(function() { 
    alertObject(object); 
}, 1000); 

我认为这是你需要的。

相关问题