2011-10-16 14 views
5

Javascript uygulaması için Kullanıcının bir nesnenin durumunu kaydetmesine izin verebilmem gerekir. Bu, daha önce dinamik olarak veya bir GUI aracılığıyla oluşturulan ve daha sonra kaydedilmiş işlevleri yükleyen bir dizi özel işlev kaydetmeyi içerir. Esas olarak işlevleri serileştirip dizisi kaldırmam gerekiyor.Javascript'in Ters Çalışması Function.toString()

Şu anda Fonksiyon nesnenin .ToString() yöntemini kullanarak serialize kısmını başarmak:

func.toString().replace('"', '\"').replace(/(\r)/g, ' ').replace(/(\n)/g, ' ').replace(/(\t)/g, ' ') 

Bu bana verir bu güzellik gibi "tefrika" fonksiyonları (fonksiyon isimsiz olduğuna dikkat edin):

"function (someParameter) {this.someFunctionName(return 'something';}" 

Bu işlemin üstesinden gelmek, mücadele ettiğim yerdir. Bunun üzerine eval() çağırmadan önce t = ile seri işlevini prepend nasıl

var func = eval('t =' + so.actions[i].func); 

Not: fonksiyonlarını unserializing Benim şimdiki en iyi çözüm budur. Bunu yapmayı sevmiyorum çünkü küresel bir değişken yaratıyor ama etrafında bir yol bulamıyorum. fonksiyonunu ancak undefined dönmez var t =, eval() prepending zaman

alternatif yollar için "unserialize" isimsiz fonksiyon var mıdır

. Bu prepending değil, ben bir "Beklenmeyen belirteç (SyntaxError" alırlar.?

PS: Kullanıcı girdisi üzerinde eval() kullanmanın güvenlik etkilerinin farkındayım: Öngörülebilir bir gelecekte bu yazılımın tek kullanıcısıyım, bu nedenle şu anda bir sorun değil:

cevap

6

İşlev İşlevini kullanabilirsiniz. global değişken oluşturulmasını önlemek için kurucu:

var func = Function("return " + so.actions[i].func)(); 
işlevi içinde değişkenler "değişim" Eğer seri hale getirilmeye ve de- ne zaman bu kadar, yakalamak mümkün olmayacaktır çevreleyen kapatma olduğu dikkatli olmak

var func = eval("(function() { return " + so.actions[i].func + " })()"); 

Bir şey:

Bueşdeğerdir serialize.

düzenlemek

ben düşünmüyorum, tabii ki sadece yapabilirsiniz:

var func = eval("(" + so.actions[i].func + ")"); 
+0

kapatma halledilir. Bu işlevler sadece 'Function.call (theContextTheFunctionIsExecutedIn)' kullanılarak gerçekleştirilir. Serileştirilmiş işlevi parantez çalışmaları ile çevrelemenizin öneri - bu nedenini biliyor musunuz? – jonemo

+1

[MDN] 'ye göre (https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope), parantezlerin eklenmesi onu bir * declaration * işlevinden * function * ifadesine * değiştirir. (Parens içinde bir ifadenin bir parçası.) Bir ifade olduğu için, “func” a atayabileceğiniz bir değer döndürecektir. Bu ayrıca, değerlendirmenin şu anda içinde olduğu kapsama da bağlı olabilir. –

+0

Ayrıca bkz. Http://kangax.github.com/nfe/ – user123444555621

0

Bu çalışması gerekir:

eval('var func = ' + so.actions[i].func);