在cookie中存储JavaScript函数?

在cookie中存储JavaScript函数?,javascript,angularjs,cookies,Javascript,Angularjs,Cookies,是否可以在cookie中保存JavaScript函数?如果是,怎么做 例如,我有键盘快捷键的用户设置,但与每次击键关联的行为可以是自定义的。我希望在cookie中保存这些可能唯一且特定于用户的映射 我目前正在使用Angular 1.4.7来放置cookie。它返回的数据去掉了函数 不,不能在cookie上存储函数。不过,您可以将对函数的引用存储在关联数组中,而将键存储在cookie中。这样,当加载cookie时,使用键“重新加载”函数 编辑: 基于我的第一个答案,理想的(IMO)解决方案是定义一

是否可以在cookie中保存JavaScript函数?如果是,怎么做

例如,我有键盘快捷键的用户设置,但与每次击键关联的行为可以是自定义的。我希望在cookie中保存这些可能唯一且特定于用户的映射


我目前正在使用Angular 1.4.7来放置cookie。它返回的数据去掉了函数

不,不能在cookie上存储函数。不过,您可以将对函数的引用存储在关联数组中,而将键存储在cookie中。这样,当加载cookie时,使用键“重新加载”函数

编辑:

基于我的第一个答案,理想的(IMO)解决方案是定义一个提供相同功能的工厂。这样就可以根据需要将其注入到您的模块中。例如,您可以做(粗略演示):

并使用令牌调用工厂,以获取对您定义的函数之一的引用:

$scope.fromFactory = getUserFunctions("goodbye");

不,不能在cookie上存储函数。不过,您可以将对函数的引用存储在关联数组中,而将键存储在cookie中。这样,当加载cookie时,使用键“重新加载”函数

编辑:

基于我的第一个答案,理想的(IMO)解决方案是定义一个提供相同功能的工厂。这样就可以根据需要将其注入到您的模块中。例如,您可以做(粗略演示):

并使用令牌调用工厂,以获取对您定义的函数之一的引用:

$scope.fromFactory = getUserFunctions("goodbye");
您不应该将函数保存在cookie中。相反,您应该创建一个包含用户可以执行的所有可能方法的对象,并存储方法名称,即:

var customUserFunctions = {
    someMethod: function() { ... },
    ...
};
然后将
“someMethod”
存储在cookie中,并使用
customUserFunctions[variableHoldingSomeMethodString]()
调用它

也就是说,这是将函数存储在cookie中的方式:

// Define your function
var myFunc = function() { console.log("I'm a stored function!"); };
// Turn it into a string
var myFuncString = myFunc.toString();
// Store it in your cookie
document.cookie = myFuncString;
// get your function back
var myCookieFunc = eval(document.cookie);
// call it
myCookieFunc();
请注意,这将创建一个安全漏洞,攻击者可以在其中修改cookie,并且您的代码将执行他们放入其中的任何函数。

您不应该将函数保存在cookie中。相反,您应该创建一个包含用户可以执行的所有可能方法的对象,并存储方法名称,即:

var customUserFunctions = {
    someMethod: function() { ... },
    ...
};
然后将
“someMethod”
存储在cookie中,并使用
customUserFunctions[variableHoldingSomeMethodString]()
调用它

也就是说,这是将函数存储在cookie中的方式:

// Define your function
var myFunc = function() { console.log("I'm a stored function!"); };
// Turn it into a string
var myFuncString = myFunc.toString();
// Store it in your cookie
document.cookie = myFuncString;
// get your function back
var myCookieFunc = eval(document.cookie);
// call it
myCookieFunc();

请注意,这将创建一个安全漏洞,攻击者可以在其中修改cookie,并且您的代码将执行他们放入其中的任何函数。

您可以尝试使用函数对象。将函数的内容保存在cookie中,然后检索,再将其传递给构造函数

var str = "{alert(1)}";
var f = new Function(str);
f();
小提琴:


但我认为这不是这种情况下的最佳方法。

您可以尝试使用函数对象。将函数的内容保存在cookie中,然后检索,再将其传递给构造函数

var str = "{alert(1)}";
var f = new Function(str);
f();
小提琴:


但我不认为这是这种情况下的最佳方法。

cookies只保存一个字符串,因此您需要保存函数的字符串,然后用eval加载它,但不推荐这样做。不确定是否有更好的方法如果你像你的帖子所建议的那样使用angularjs,请参阅下面我的更新答案。它比使用eval安全得多。cookies只保存一个字符串,因此您需要保存函数的字符串,然后用eval加载它,但不推荐这样做。不确定是否有更好的方法如果你像你的帖子所建议的那样使用angularjs,请参阅下面我的更新答案。它比使用eval安全得多。实际上,您可以将代码存储在cookie中,cookie可以通过计算生成函数。这可能不是解决OP问题的正确方法,但它是可以做到的。@jfriend00:而且你真的需要担心这样一个解决方案的XSS功能。你存储的是一个sring,而不是一个
函数。在我看来,工厂式的解决方案是最好的办法。我想指出的是,我是第一个给出这种解决方案的人,结果被否决了。当然,您可以使用映射/关联数组来代替开关,并且仍然可以在需要的任何地方注入工厂。在这种情况下使用开关的好处是,您可以使用默认情况,如果映射不包含给定值,则最好返回undefined。此外,您还可以在默认情况下实现一些错误处理(当然,您也可以在不使用开关的情况下实现),以捕获将来可能出现的错误。另外,我不知道为什么其他回应被否决;我对你的回答投了更高的票,所以它不是否定的:)好吧,你实际上可以将代码存储在一个cookie中,这个cookie可以通过计算来生成一个函数。这可能不是解决OP问题的正确方法,但它是可以做到的。@jfriend00:而且你真的需要担心这样一个解决方案的XSS功能。你存储的是一个sring,而不是一个
函数。在我看来,工厂式的解决方案是最好的办法。我想指出的是,我是第一个给出这种解决方案的人,结果被否决了。当然,您可以使用映射/关联数组来代替开关,并且仍然可以在需要的任何地方注入工厂。在这种情况下使用开关的好处是,您可以使用默认情况,如果映射不包含给定值,则最好返回undefined。此外,您还可以在默认情况下实现一些错误处理(当然,您也可以在不使用开关的情况下实现),以捕获将来可能出现的错误。另外,我不知道为什么其他回应被否决;我对你的回答投了更高的票,所以它不是否定的:)不需要f