评估IE8中的传输功能

时间:2011-04-09 15:40:07

标签: javascript function internet-explorer-8

我需要通过JSON传输JavaScript对象并传输它的功能。我找到了获取函数字符串并转移它们的工作版本。然后我可以再次评估它们。

//Create the function
var myFunction = function(){alert('Hello, my Function!');}
//get the functions String reprensentation
var myFunctionTransferString = myFunction.toString();

//Now we transfered the object and want to have a function back
var myTransferedFunction = eval('(' + myFunctionTransferString + ')');
//call the transfered function
myTransferedFunction();

这里我有一个jsfiddle:http://jsfiddle.net/bMjug/

这可以在Firefox,Chrome和Safari中使用(但你可以猜到,不是那种称为Internet Explorer的微软软件)。

在我要评估函数的行中,我在IE8中收到消息fn is null or not an object

实际上我找到了解决方案,但我真的不喜欢这个解决方案。如果我把变量声明放入String我正在评估和删除parantheses因为我不再期待一个可以做我想要的对象:

eval('var myTransferedFunction = ' + myFunctionTransferString);

但是我发现这种黑客攻击和糟糕的解决方案。

现在有人为这个问题做得更好吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

对于它的价值,问题是由JScript错误地解释这个问题引起的:

(function x() {})

作为FunctionDeclaration而不是FunctionExpression,所以做一个statement-eval而不是expression-eval。类似于没有包装括号的{}对象文字所发生的情况。你可以通过做一些更明确地将其推送到解析表达式来解决它,例如:

eval('['+myFunctionTransferString+'][0]');

严重不要。永远不要依赖函数的字符串表示,它不是标准化的,而是有many browser differences

即使函数分解是可靠的,也无法保留函数,因为函数的功能远远多于其源的文本表示。它包含的闭包无法表示,闭包在现实世界的JavaScript中越来越常见。

我担心通常没有廉价的方法来序列化/重新实例化JavaScript对象。 JSON子集是可靠的子集,其余的你必须编写自己的ad hoc序列化格式。

答案 1 :(得分:0)

函数不是JSON规范的一部分。请记住,JSON规范是JavaScript语法的一个子集。

所以你的'黑客'解决方案实际上是更正确的解决方案。

答案 2 :(得分:0)

这是一些被黑客入侵的解决方案:

var fn = function() { alert("some text"); }

var fnFromString = new Function("return " + fn.toString()); // function anonymous() { return function() { ... } }
fnFromString = fnFromString(); // function() { alert("some text"); }

如果您立即执行脚本:

eval("(" + fn.toString() + ")()"); // fn executed.