Оценка функций для передачи в IE8 - PullRequest
1 голос
/ 09 апреля 2011

Мне нужно передать объекты JavaScript через JSON, а также передать его функции. Я нашел рабочую версию получения строк функций и их передачи. Тогда я могу оценить их снова.

//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, как и должно (но, как вы можете догадаться, не в том большом пакете программного обеспечения Microsoft, называемом Internet Explorer).

В строке, где я хочу оценить функцию, я получаю сообщение fn is null or not an object в IE8.

На самом деле я нашел решение для этого, но мне действительно не нравится это решение. Если я помещу объявление переменной в строку, я оцениваю и удаляю паразиты, потому что я больше не ожидаю объект, который будет делать то, что я хочу:

eval('var myTransferedFunction = ' + myFunctionTransferString);

Но я нахожу такого рода взломанное и плохое решение.

Кто-нибудь сейчас лучше для этой проблемы?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

Во всяком случае, проблема вызвана тем, что JScript неправильно интерпретирует это:

(function x() {})

как FunctionDeclaration, а не FunctionExpression, так что выполняется выражение-выражение вместо выражения-выражения. Подобно тому, что происходит с {} объектными литералами без заключающих в скобки. Вы можете обойти это, сделав что-то, чтобы более явно подтолкнуть его к анализу выражения, например:

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

Но серьезно, не . Никогда не полагайтесь на строковое представление функции, оно не стандартизировано и есть много отличий браузера .

Вы не могли бы с пользой сохранить функцию, даже если бы декомпозиция функции была надежной, поскольку функция намного больше, чем текстовое представление ее источника. Закрытия, которые он включает, не могут быть представлены, и замыкания все чаще встречаются в реальном JavaScript.

Боюсь, что не существует дешевого способа сериализации / создания экземпляров объектов JavaScript в целом. Подмножество JSON - это надежное подмножество, для остального вам придется кодировать свои собственные специальные форматы сериализации.

0 голосов
/ 09 апреля 2011

Вот некоторые взломанные решения:

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.
0 голосов
/ 09 апреля 2011

Функции не являются частью спецификации JSON.Помните, что спецификация JSON является подмножеством синтаксиса JavaScript.

Так что ваше «взломанное» решение на самом деле является более правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...