Могу ли я хранить функции JavaScript в массивах? - PullRequest
26 голосов
/ 29 августа 2010

Как я могу хранить функции в массиве с именованными свойствами, чтобы я мог вызывать как

FunctionArray["DoThis"]

или даже

FunctionArray[integer]

Примечание: Я не хочу использовать eval.

Ответы [ 8 ]

32 голосов
/ 29 августа 2010

Важно помнить, что функции - это объекты первого класса в JavaScript.Таким образом, вы можете передавать их как параметры, использовать их как значения объектов и так далее.Значения в массиве являются лишь одним примером этого.

Обратите внимание, что мы не храним функции в массиве, хотя мы можем сделать это и получить к ним доступ с помощью числового индекса.Мы храним их в обычном объекте с ключом, именем которого мы хотим получить доступ к этой функции.

var functions = {
    blah: function() { alert("blah"); },
    foo: function() { console.log("foo"); }
};

вызовите как

functions.blah();

или

functions["blah"]();
13 голосов
/ 29 августа 2010

Требуется литерал объекта, а не массив.

x = { 'dothis': function() { alert('hi'); } };

Объект

x['dothis']()

Вы также можете динамически вызывать

y = 'dothis';
x[y]()

Статический / с жестким кодомвызов:

x.dothis()

Если вы хотите массив, хотя:

x = [function(){alert('hi');}][0]()
3 голосов
/ 27 октября 2016

на самом деле вы можете сделать это, просто объявив это вне массива, например ...

const your_function = function(){ console.log( "I am your function" ) }

const group = [ 0, "lizard", false, your_function() ]

group[ 3 ]

вы также можете изменить место его вызова, если хотите ...

const your_function = function(){ console.log( "I am your function" ) }

const group = [ 0, "lizard", false, your_function ]

group[ 3 ]()

РЕДАКТИРОВАТЬ: функции были названы неправильно: / sry

2 голосов
/ 12 августа 2013

Вы даже можете использовать функцию в качестве имени свойства:

var func = function(a, b){alert(a+b)};
var obj = {};
obj[func] = 2;
2 голосов
/ 29 августа 2010

Вы можете получить доступ к свойствам объекта через его имя (x ["A"]), если вы хотите назначить индексы (0 = "A"), вы должны сделать это, вот пример ,(Я не уверен, что цикл for будет работать в любом браузере, я тестировал на Firefox, но вы можете понять это)

var x = {};

x.A = function() { alert("func 1"); };
x.B = function() { alert("func 2"); };


var i = 0;
for (a in x)
{
    x[i] = x[a];
    ++i;
}


x[0](); // func 1
x[1](); // func 2
x["A"](); // func 1
x["B"](); // func 2
1 голос
/ 24 декабря 2016

В основном функция - это особый тип объекта в javascript. И в javascript, в массиве вы можете хранить что угодно (не обязательно того же типа). Так что по этому, да! Вы можете сохранить функцию, объект, примитивные значения в массиве в JavaScript.

var arr = ["hello",true,false, 1, {name: "arshad"}, function(){}]

И вы можете смешивать объект и функцию, чтобы сделать именованную функцию такой:

{ callBythisname: function(){ .... }}

Вы также можете сохранить этот объект в массиве

var arr = [{ callBythisname: function(){ .... }}];

Если вы хотите позвонить, звоните, как:

arr[0].callBythisname();
1 голос
/ 27 октября 2013

Вот массив, который содержит различные типы данных, включая функцию.

Хотя в этом примере есть объект, функция не находится внутри объекта.

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

Я могу вызвать функцию из массива или без него.

myArray = [
        1,
        true,
        "String",
        {
            name: "trey",
            age: 43,
        },
        [1,2,3,4],
        myFunction = function(){
            console.log("whats up!");
        },
        myArray[5](),
    ];
    console.log(myArray);
    myArray[5]();

Вот вывод:

whats up!
[ 1, true, 'String', { name: 'trey', age: 43 }, [ 1, 2, 3, 4 ], [Function], undefined ]
whats up!
1 голос
/ 29 августа 2010

Вы можете хранить вещи непосредственно в массиве, но как объект, например:

var Functions = { DoThis: function() { alert("do this"); } };

Functions['DoThis'](); //alerts "do this"
Functions.DoThis()     //alerts "do this"

Вы можете попробовать здесь .

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