函数真的是JavaScript中的第一类对象吗?

时间:2015-02-16 17:46:45

标签: javascript

我是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!");}

但它不起作用,我没有看到警报。我做错了什么,或者只是在源代码中定义了唯一可调用的函数?

4 个答案:

答案 0 :(得分:4)

是的,函数是第一类对象。

&#13;
&#13;
function one() {
  alert("Hello");  
}

function runAnotherFunction(anotherFunction) {
  anotherFunction();  
}

runAnotherFunction(one);
&#13;
&#13;
&#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);