Использовать переменную JavaScript в качестве имени функции? - PullRequest
10 голосов
/ 01 сентября 2010

У меня есть следующий код в Javascript:

jQuery(document).ready(function(){
    var actions = new Object();
    var actions;
    actions[0] = 'create';
    actions[1] = 'update';
    for (key in actions) {
        // Dialogs
        var actions[key]+Dialog = function(){
            $('#'+actions[key]+'dialog').dialog('destroy');
            $('#'+actions[key]+'dialog').dialog({
                resizable: false,
                height:600,
                width:400,
                modal: true,
                buttons: {
                    Cancel: function() {
                        $(this).dialog('close');
                    }
                }
            });
        };
    }
});

Я хочу создать 2 функции в цикле (createDialog и updateDialog). Как я могу это сделать? В PHP очень простой $$ var. Но как сделать переменную переменную в JS, я не знаю.

Спасибо

Ответы [ 5 ]

6 голосов
/ 01 сентября 2010

Как это:

actions[key + "Dialog"] = function () { ... };

Однако, поскольку функции Javascript захватывают переменные по ссылке, ваш код не будет работать должным образом.
Вам необходимо определить внутреннюю функцию внутри отдельной функции, чтобы каждая из них получала отдельную переменную (или параметр) key.

Например:

var actionNames = [ 'create', 'update' ];   //This creates an array with two items
var Dialog = { };    //This creates an empty object

for (var i = 0; i < actionNames.length; i++) {
    Dialog[actionNames[i]] = createAction(actionNames[i]);
}

function createAction(key) {
    return function() { ... };
}

Вы можете использовать это так:

Dialog.create(...);

EDIT

Вы пытаетесь загрязнить глобальное пространство имен несколькими функциями, связанными с диалогами.
Это плохая идея; Лучше организовать ваши функции в пространство имен.

Если вы действительно хотите расширить глобальное пространство имен, вы можете сделать это следующим образом:

var actionNames = [ 'create', 'update' ];   //This creates an array with two items

for (var i = 0; i < actionNames.length; i++) {
    this[actionNames[i] + 'Dialog'] = createAction(actionNames[i]);
}

Это создаст для глобальных функций, называемых createDialog и updateDialog.
При обычном вызове функции ключевое слово this относится к глобальному пространству имен (обычно это объект window).

2 голосов
/ 01 сентября 2010

Вам понадобится ссылка на объект области действия, в котором вы хотите создать функции.Если это глобальная область, вы можете использовать window:

window[ actions[key] + "Dialog" ] = function(){ ... }
0 голосов
/ 01 сентября 2010

Я думаю, вы пытаетесь сделать что-то, что вам не нужно делать в JavaScript. В PHP передача функций немного сложна. В JavaScript это элегантно и безболезненно.

Как вы планируете вызывать эти функции позже? Я предполагаю, что эти имена функций жестко запрограммированы в вашем HTML в атрибутах 'onclick'. Жесткое кодирование JavaScript в ваш HTML с помощью атрибутов on* - плохая идея. Если это то, что вы делаете, вы должны создавать переменные в глобальной области видимости (лучше избегать другой практики). В браузере глобальный объект - window. Если вы определите свойство для window, функция будет доступна глобально:

$(document).ready(function() {
  var myNames = [
    'create',
    'destroy'
  ];
  for (var i = 0; i < myNames.length; i++) {
    window[myNames[i] + 'Dialog'] = function() {
      alert('Hello');
    };
  }
});

Это предполагает, что у вас есть onclick атрибуты в вашем HTML, которые совпадают с именами функций, которые вы создаете.

Лучший способ сделать это - просто создать функции по мере их привязки к событиям, даже не назначая их переменным:

$(document).ready(function() {
  $('#createdialog, #destroydialog').each(function() {
    $(this).click(function() {
      alert('Hello');
    });
  });
});

Это сделает ваш JavaScript и ваш HTML меньше и чище.

0 голосов
/ 01 сентября 2010

Вам нужно объединить ответы SLaks и RoToRa:

var actionNames = [ 'create', 'update' ];   //This creates an array with two items

for (var i = 0; i < actionNames.length; i++) {
    window[ actionNames[i] + 'Dialog' ] = function() {
        $('#'+ actionNames[i] +'dialog').dialog('destroy');
        $('#'+ actionNames[i] +'dialog').dialog({
            resizable: false,
            height:600,
            width:400,
            modal: true,
            buttons: {
                Cancel: function() {
                    $(this).dialog('close');
                }
            }
        });
    }
}

Так как вы запускаете это в обработчике события готовности документа, переменная "this" будет ссылаться на документ, а не на окно.

0 голосов
/ 01 сентября 2010

javascript global scope является окном, поэтому вы можете написать:

var funcName='varfuncname';
    window[funcName]=function() {
    alert('HI!');
}

Теперь вы можете назвать его как window[funcName]();, window['varfuncname'](); или varfuncname();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...