我想将Javascript字符串转换为实际的函数,我可以将其附加到属性并重用。
var fn = 'function say(something) { alert(something); }';
fn.say('hello');
fn.say('world');
我实际上并不想实现这个......这是纯粹的Javascript好奇心。
答案 0 :(得分:0)
您想使用eval()
功能。但是您在上面显示的内容不会在fn
变量上创建属性。它只是创建一个您分配给fn
的函数。如果要创建具有属性say
的对象,请尝试改为:
var fn = eval('({ say: function (something) { alert(something); }})');
这将计算解析为包含名为say
的属性的对象的表达式。此属性值是一个可以像上面描述的那样调用的函数:
fn.say('hello');
此外,尽管eval()
获得了所有瑕疵,但实际上有一些用途。
就安全问题而言,eval()
本身不会为您的代码添加任何明显的漏洞。除非你做了一些非常不负责任的事情(比如在用户输入上调用eval()
),否则没有任何东西可以通过它的存在来引入,无论如何都不会引起关注。通常给出的论点是评估从服务器返回的内容时的安全威胁。这种威胁假设我们甚至不能信任服务器,在这种情况下我们可能会遇到更大的问题。另一个经常使用的论点是中间人攻击,有人将恶意内容注入我们的资源请求。再一次,如果发生这种情况,我们可能会有更大的担忧。如果攻击者能够将恶意内容注入服务器响应中,则无法阻止他们:
最重要的是,不使用eval()
的安全威胁论据通常是威胁,无论您的代码是否使用eval()
,这些威胁都会出现问题。尽管其他人可能会说,eval()
只是工具箱中的另一个工具。不要随意使用它,或者另一段代码可能做得更好。但即使Douglas Crockford告诉你,也不要完全忽视它。
希望这有帮助!
参考文献:
Secrets of the JavaScript Ninja
eval() isn't evil, just misunderstood