我的问题有点复杂,但我会尽力说出来。
我正在建立一个涉及大量JavaScript的网站。我没有设置所有设置,所以一些脚本没有与任何东西连接。我想创建一个弹出控制台,允许我输入我希望计算机执行的功能,并让计算机这样做。
我可以使用变量然后使用该变量示例调用函数:
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();
我知道我没有正确地做到这一点,但是一种方法还是我只是疯了?
答案 0 :(得分:3)
您可以将所有可用功能存储在对象中
var availableFunctions {
cat: correspondingFunction
}
然后你可以输入一个字符串
var input = 'cat';
availableFunctions[input]();
答案 1 :(得分: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控件的fiddle
答案 2 :(得分: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()
因为在这种情况下可能不是你想要的,你应该考虑重命名函数(如果实际代码的函数以大写字母开头)
答案 3 :(得分: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);