Javascript: вызов функции, написанной в анонимной функции из String, с именами функций без eval?

Update2:
То, что я действительно хотел спросить, уже обсуждалось на другой странице. Пожалуйста, проверьте следующую запись.
(Спасибо BobS.)
Как я могу получить динамический доступ к локальной области видимости в javascript?


Привет.

Я начал использовать jQuery, и мне интересно, как динамически вызывать функции в анонимной функции из String. Скажем, например, у меня есть следующие функции:

function foo() {
 // Being in the global namespace, 
 // this function can be called with window['foo']()
  alert("foo");
}

jQuery(document).ready(function(){
  function bar() {
    // How can this function be called 
    // by using a String of the function's name 'bar'??
    alert("bar");
  }

  // I want to call the function bar here from String with the name 'bar' 
}

Я пытался выяснить, что может быть аналогом «окна», которое может вызывать функции из глобального пространства имен, например, window["foo"]. В приведенном выше небольшом примере, как я могу вызвать панель функций из строки «bar»?

Спасибо за помощь.

Обновление:
Вот что я хочу:

  1. Определите функции, которые используются только в замыкании.
  2. Избегайте создания объекта в замыкании, который содержит эти функции, чтобы к нему можно было получить доступ как obj['bar'].
  3. Избегайте eval (если возможно), чтобы писать код более простым способом (если он существует).
  4. Определите имя функции динамически через параметр URI или любую переменную.

Будучи новичком в Javascript, я подумал, что «это» будет аналогом «окна» в закрытии, и попытался написать:

// in the closure
name = 'bar';
this[name]; // undefined ...

и не удалось (конечно...).
Все это для погони за дальнейшей ленью. Javascript для меня в новинку, и в настоящее время я пытаюсь писать как можно более ленивый код.


person Wanien    schedule 08.03.2010    source источник
comment
Eval кажется хорошим вариантом здесь. Вероятно, вы все равно создаете вложенные замыкания, не так ли? Можете ли вы объяснить сценарий? Почему у вас есть bar в виде строки? Рассматривали ли вы определение этих функций там, где они вам нужны?   -  person Kobi    schedule 08.03.2010
comment
Большое спасибо за ваш комментарий и совет. Чтобы было понятно, я добавил то, что хочу, на доску вопросов выше (ниже редактирования). Надеюсь, на этот раз моего объяснения достаточно, чтобы его поняли. Спасибо.   -  person Wanien    schedule 08.03.2010


Ответы (2)


Как писал Коби, eval может быть хорошим вариантом. В качестве альтернативы, есть ли причина не делать

$(function(){
  var localNamespace = {};
  function bar() {
      alert("bar");
  }
  localNamespace['bar'] = bar;
  // Now bar() can be called by, well, localNamespace['bar']
}

Обновление: Похожие записи SO, такие как Как я могу получить динамический доступ к локальной области в javascript?, кажется, указывает на то, что вам не повезло, не используя один из этих двух подходов или что-то еще более уродливое.

person BobS    schedule 08.03.2010
comment
Большое спасибо за ваш комментарий и совет. Я ценю это. И большое спасибо за ссылку. Я пытался найти такую ​​запись, прежде чем писать сюда, но не смог найти. Зная, что невозможно делать то, что именно я хочу, я сделал большой шаг. Большое спасибо БобС еще раз. - person Wanien; 08.03.2010

Внутри вашей функции ready:

window.bar = function bar() {
    // ...
}

Затем вы можете получить доступ к window['bar'].

person Chris Jester-Young    schedule 08.03.2010
comment
Большое спасибо за быстрый ответ. Я ценю это. Однако я хочу определить функциональную панель в закрытии, а не в глобальной области, потому что я хочу, чтобы функция была ограничена конкретной функцией (ситуацией). Мне жаль, что моего объяснения, вероятно, было недостаточно. Спасибо. - person Wanien; 08.03.2010
comment
Извините, если я играю здесь адвоката дьявола, но: если вы хотите получить доступ к функции из-за пределов замыкания, зачем определять ее внутри замыкания? Разве это не противоречит цели? - person Zack The Human; 08.03.2010
comment
Любое указание будет приветствоваться здесь :) Спасибо за ваш комментарий. Я хочу получить доступ к функции изнутри закрытия, а не снаружи, путем динамического вызова функции из строки имени функции. Но на самом деле мне также было интересно, можно ли это вызвать из-за пределов замыкания :) - person Wanien; 08.03.2010