1

我的问题有点复杂,但我会尽我所能。

我正在制作一个涉及大量 javascript 的网站。我没有设置所有内容,因此某些脚本没有与任何内容相关联。我想制作一个弹出式控制台,允许我输入我希望计算机执行的功能并让计算机执行此操作。

  1. 我可以有一个变量,然后使用该变量示例调用一个函数:

    var CodeApprentice = "Cat";
    function Cat(){
      document.write("kitten");
    } 
    function Dog(){
      document.write("puppy");
    }
    //Here is were I want to call the function with the variable   CodeApprentice   
    // and have it do the cat function
    function CodeApprentice();
    

我知道我没有正确地做到这一点,但有没有办法做到这一点,或者我只是疯了

4

4 回答 4

3

您可以将所有可用功能存储在一个对象中

var availableFunctions {
  cat: correspondingFunction
}

然后您可以将输入作为字符串

var input = 'cat';

availableFunctions[input]();
于 2013-06-10T14:12:56.957 回答
1

使用.call.apply

var codeApprentice = Cat;

codeApprentice.call(null);

你可以有一个更清洁的解决方案,有更好的成分

// my_class.js
var MyClass = function() {};

MyClass.Cat = function() {
  document.write("kitten");
};

MyClass.Dog = function() {
  document.write("puppy");
};

// usage
var codeApprentice = "Cat";
MyClass[codeApprentice].call(null);
// => "kitten"

这是一些HTML控件的小提琴

于 2013-06-10T14:15:01.677 回答
1

您可以通过点符号两种方式访问​​对象的任何属性

obj.propertyName

或使用属性名称作为键

obj["propertyName"]

您在全局名称 sapce 中定义的任何函数都将成为全局对象的一部分,因此在您的情况下您可以这样做

//this is meant as a to the global object other names might be appropriate
//such as window depending on the context
this[CodeApprentice]()

执行功能Cat

写作

function Cat() {
}

相当于

Cat = function(){
}

后者更明确地表明它实际上是一个this被设置的属性(我并没有说它很明显,它隐藏的事实比前一个少)

最后一点,一般惯例是以大写字母开头的函数是构造函数,应该使用新的关键字调用,例如new Cat(),因为在这种情况下这可能不是你想要的,你应该考虑重命名函数(如果实际代码具有以大写字母开头的功能)

于 2013-06-10T14:18:24.623 回答
0

您可以这样做,甚至可以在其中传递参数

var strFun = "Cat";
var strParam = "";

//Create the function
var fn = window[strFun];

//Call the function
fn(strParam);

或者你可以使用这样的eval()功能来做到这一点

var strFun = "Cat";
var strParam = "";

//Create the function call from function name and parameter.
var funcCall = strFun + "('" + strParam + "');";

//Call the function
var ret = eval(funcCall);
于 2013-06-10T14:14:49.243 回答