Javascript:在localstorage中存储函数

时间:2016-08-12 21:12:18

标签: javascript jquery local-storage

是否可以插入localstorage或是否有其他方式来存储它?

ProfileResponseWrapper

2 个答案:

答案 0 :(得分:7)

我不知道你为什么要这样,我不推荐它,但你可以使用toString来做。

存储它:

var myFunc = function (){
  alert('Hello world!');
};

// Store it as a String
localStorage.setItem('compressedFunc', myFunc.toString());

稍后,检索它:

var compressedFunc = localStorage.getItem('compressedFunc');

// Convert the String back to a function
var myFunc = eval('(' + compressedFunc + ')');

// Use it
myFunc();

答案 1 :(得分:0)

如果您使用JavaScript编码功能,则无需从expect(Object.getPrototypeOf(UF_Controller.router)).to.equal(express.Router); 恢复它,因为您已经可以使用它。

你不能JSON编码一个函数。您可以保存该函数的源代码,并在检索时将localStorage应用于它。但众所周知,这有一定的风险,在eval是邪恶的”这句话中被捕获。

如果您要创建一个能够详细描述该函数应该执行的操作的对象结构,那么您可以稍微限制该风险。在您的情况下,函数中的每个语句都是应用于jQuery选择器的方法。您可以使用以下对象表示:

eval

然后你的实际函数可以将该对象作为其输入,并对其进行处理,从而产生相同的效果:

var compressed = [
    { selector: '.whole_wrap_of_editcriteria', method: 'css',         args: ['display', 'none'] },
    { selector: '#wrappler',                   method: 'css',         args: ['display', 'none'] },
    { selector: '#li_addcriteria',             method: 'css',         args: ['display','none'] },
    { selector: '#li_menu1',                   method: 'addClass',    args: ['active'] },
    { selector: '#home',                       method: 'removeClass', args: ['active'] },
    { selector: '#menu1',                      method: 'addClass',    args: ['active'] },
    { selector: '#title_panel',                method: 'html',        args: ['Edit criteria scoring'] }
];

现在,当你想将这些知识保存到var applyInstructions = function(instructions) { instructions.forEach( cmd => $(cmd.selector)[cmd.method](...cmd.args) ); } 时,你只需要存储上面构造的对象,如下所示:

localStorage

在检索之后,您将在其上执行泛型函数:

// save to localStorage:
localStorage.setItem('compressed', JSON.stringify(compressed));

这类似于使用// get from localStorage: applyInstructions(JSON.parse(localStorage.getItem('compressed'))); ,但它的优势在于您可以对可以执行的内容设置限制(在eval中)。例如,您可以检查applyInstructions属性应该只是其中一个值methodcssaddClassremoveClass,尽管最后一个属性可以要保持危险。如果可能,html将是更好的选择。

以下是更安全textContent的样子:

applyInstructions