我在javascript中运行一个自执行函数,不会干扰页面上的任何全局变量。我有一个字符串,其中包含我要调用的函数的名称。该函数在我的自执行函数中声明。有没有办法通过使用字符串调用该函数?
(function(document, window){
var functionName = "myFunction";
window[functionName](); //This does not work...
function myFunction(){
//Do some stuff
}
}(document, window)
我发现了这个:How to execute a JavaScript function when I have its name as a string
但是我的函数是自动执行而没有名字,所以我无法用窗口变量引用它。
答案 0 :(得分:4)
这只是其他人所建议的更清晰的版本,没有全局污染,没有评估,也没有模糊的变量引用(arguments.callee和“this”)。
// Not sure why you were passing in doc and window, so I took it out for clarity
(function(){
var funcs = {
funcA: function () { return "a"},
funcB: function () { return "b"}
};
var functionName = "funcA";
funcs[functionName]();
}();
这种方法确实要求您在使用它们之前声明这些函数。
答案 1 :(得分:3)
没有全球污染,避免使用非严格的arguments.callee
方法。
基于this answer。
// This Immediately Invoked Function Expression is invoked via `call`.
// call() takes 1 or more arguments: the first being the scope you want the
// invoked function be in; the other arguments become arguments of the function
// itself.
// In this case, the scope of our function is an empty object ({}).
// This object allows us to attach functions using the this.* syntax and call the
// functions with this["string"]() without ever polluting the global namespace.
// It is also forward compatible with ECMAScript 5's scrict-mode as it does not
// use arguments.callee.
(function(document, window){
var functionName = "myFunction";
// you'll need to define the function _before_ you call it.
this.myFunction = function(){
//Do some stuff
alert('me');
};
this[functionName]();
}.call({}, document, window));
答案 2 :(得分:1)
您可以使用eval(functionName + "()")
,因为window
的任何功能也是全局功能。
答案 3 :(得分:1)
您可以将myFunction
函数存储在某处(例如 一个新对象)吗?this
请参阅jsFiddle example:
(function (document, window){
var functionName = "myFunction",
myFunctions = {
myFunction: function() { alert('myFunction'); }
};
myFunctions[functionName]();
}(document, window));
答案 4 :(得分:1)
如果您在调用之前不介意定义该功能,可以使用arguments.callee
。这避免了eval。
(function (){
arguments.callee.f = function() {
console.log('test');
};
arguments.callee['f']();
})();
答案 5 :(得分:0)
你是对的。这是因为您的函数是在自执行函数中定义的。窗户不了解内部封闭。你能做的最好的可能就是eval:
a la:
eval(functionName + "();");
,在这种情况下可能不是那么邪恶:When is JavaScript's eval() not evil?
答案 6 :(得分:0)
尝试:
functionName.apply(context
,arguments
)
要么
functionName.call(context
[,argument 1
,argument 2
,...])(view reference)
或者(作为下面提到的海报)你可以将函数添加到窗口命名空间中的对象:
var newObj = {}; newObj.myFunction = function(){// stuff}
newObj.myFunction(); //调用新函数
答案 7 :(得分:0)
我想我无法评论答案,所以我必须以这种方式发布。 Eval对我来说太危险了,因为实际的函数名是由用户以字符串形式给出的。