我是JS的新手。我听说函数可以像这种语言中的值一样被操纵。所以我尝试编写一个代码,要求用户提供一个函数,然后调用这个函数,这应该没问题。但它没有用,代码是:
<SCRIPT language=javascript>
var input;
(function PromptMessage() {
input = prompt("type the function you want called")
})()
input();
</SCRIPT>
在提示框中输入function () {alert("I am an alert box!");}
但它不起作用,我没有看到警报。我做错了什么,或者只是在源代码中定义了唯一可调用的函数?
答案 0 :(得分:4)
是的,函数是第一类对象。
function one() {
alert("Hello");
}
function runAnotherFunction(anotherFunction) {
anotherFunction();
}
runAnotherFunction(one);
&#13;
prompt
函数的返回值是字符串。
包含JavaScript代码的字符串仍然是一个字符串,无法像调用它一样被调用。
你可以eval
它,但这通常是一个糟糕的想法(就像要求用户首先编写原始JS注入你的程序一样)。
答案 1 :(得分:1)
部分问题是关于调用函数字符串,所以在这里:
var input;
(function PromptMessage() {
input = prompt("type the function you want called")
})();
function getFunctionBody(s) {
var match = s.toString().match(/function[^{]+\{([\s\S]*)\}$/);
return match ? match[1] : s;
}
Function(getFunctionBody(input))();
在提示中输入字符串
function () {alert("I am an alert box!");}
你应该得到警报。
考虑到功能参数需要做多一些工作,但我会把它留给你作为练习。
Function
构造函数比eval
更安全,因为它在自己的范围内运行,无法访问外部范围。
答案 2 :(得分:0)
(function PromptMessage() {
var input = prompt("type the function you want called");
eval(input)();
})()
会做你想要的,你需要评估字符串以使其成为一个函数。不要在真实的网站上这样做。
答案 3 :(得分:0)
提示符是返回字符串,字符串不是函数;
使用eval执行你的数据,如js
var input;
(function PromptMessage() {
input = prompt("type the function you want called")
})()
eval(input);