gpt4 book ai didi

javascript - 是否可以将对象传递给 eval/setTimeout 函数?

转载 作者:行者123 更新时间:2023-11-30 13:27:54 25 4
gpt4 key购买 nike

我在使用 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() 函数传递对象。它适用于字符串...

最佳答案

您不能序列化一个对象,同时保持该对象的身份。 (在任何语言中,不仅仅是 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 与字符串参数一起使用的原因之一。继续传递函数对象。

关于javascript - 是否可以将对象传递给 eval/setTimeout 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7858911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com