Имя функции Javascript как строка в функции самоиспускания
Я запускаю функцию self execute в javascript, чтобы не мешать никаким глобальным переменным на странице. У меня есть строка с именем функции, которую я хочу вызвать. Функция объявляется внутри моей функции самоисполнения. Есть ли способ вызвать эту функцию с помощью строки?
(function(document, window){
var functionName = "myFunction";
window[functionName](); //This does not work...
function myFunction(){
//Do some stuff
}
}(document, window)
Я нашел это: Как выполнить функцию JavaScript, когда у меня есть его имя в виде строки
но моя функция выполняется самостоятельно без имени, поэтому я не могу ссылаться на нее с помощью переменной окна.
Ответы
Ответ 1
Без глобального загрязнения и избегает нестрогого метода arguments.callee
.
На основе этого ответа.
// 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 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
Это просто более чистая версия того, что предложили другие, глобальное загрязнение, отсутствие eval и отсутствие скрытых ссылок на переменные (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]();
}();
Этот подход требует, чтобы вы объявили функции перед их использованием.
Ответ 3
Вы можете использовать eval(functionName + "()")
, так как любая функция window
также является глобальной функцией.
Ответ 4
Вы можете просто сохранить функцию myFunction
где-нибудь (например, на this
новый объект)?
См. Пример jsFiddle:
(function (document, window){
var functionName = "myFunction",
myFunctions = {
myFunction: function() { alert('myFunction'); }
};
myFunctions[functionName]();
}(document, window));
Ответ 5
Если вы не возражаете определить функцию перед ее вызовом, вы можете использовать arguments.callee
. Это позволяет избежать eval.
(function (){
arguments.callee.f = function() {
console.log('test');
};
arguments.callee['f']();
})();
Ответ 6
Вы правы. Это связано с тем, что ваша функция определена внутри вашей функции самоисполнения. Окно не знает внутреннего закрытия. Лучшее, что вы могли бы сделать, вероятно, eval:
a la:
eval(functionName + "();");
и, вероятно, не все это зло в этом случае: Когда JavaScript eval() не злой?
Ответ 7
Try:
functionName.apply(context
, arguments
)
или
functionName.call(context
[, argument 1
, argument 2
,...]) (посмотреть ссылку)
Или (в качестве плаката ниже) вы можете добавить функцию к объекту в пространстве имен окна:
var newObj = {};
newObj.myFunction = function() {//stuff}
newObj.myFunction();//вызывает новую функцию
Ответ 8
Думаю, я не могу прокомментировать ответы, поэтому я должен опубликовать его таким образом. Eval слишком опасен для меня, так как фактическое имя функции задается пользователем в строке.