вызов динамической функции jQuery [дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

75
задан Triptych 9 June 2009 в 13:30
поделиться

8 ответов

Предполагая, что метод populate_Colours находится в глобальном пространстве имен, вы можете использовать следующий код, который использует оба свойства объекта, к которым можно получить доступ, как если бы объект был ассоциативным массивом и что все глобальные объекты на самом деле являются свойствами объект хоста window.

var method_name = "Colours";
var method_prefix = "populate_";

// Call function:
window[method_prefix + method_name](arg1, arg2);
160
ответ дан Triptych 4 September 2018 в 09:20
поделиться
  • 1
    Спасибо за ответ. Бит «окно» действительно бросил меня, пока я не поймал его в Google, и обнаружил, что глобальные объекты являются частью объекта окна. Теперь это имеет смысл! Спасибо. FYI Я нашел хорошую страницу об этом здесь devlicio.us/blogs/sergio_pereira/archive/2009/02/09/… – Chris B 9 June 2009 в 13:45
  • 2
    Рад, что это помогло! Вы должны принять этот ответ, если он сработает для вас – Triptych 9 June 2009 в 13:47
  • 3
    Я сделал что-то подобное, за исключением того, что функции, которые я настраивал, были в jQuery & quot; fn & quot; Пространство имен. Например, $.fn[method_prefix + method_name](arg1, arg2); – codecraig 2 June 2011 в 17:27
  • 4
    мой чувак, я всегда считал это, но я никогда не думал, что это возможно. Наконец, чувак, и я был рад, что нашел это, спасибо всем – Sam Alexander 29 May 2015 в 04:07
  • 5
    @peter Поскольку квадратные скобки не являются объектами доступа к ресурсам в этом контексте, но обозначают Array. Массивы не являются функциями, поэтому вы не можете их называть. – Xufox 23 August 2018 в 14:53

Это рабочее и простое решение для проверки существования функции и динамической обработки этой функции другой функцией;

Функция триггера

function runDynmicFunction(functionname){ 

    if (typeof window[functionname] == "function"  ) { //check availability

        window[functionname]("this is from the function it "); //run function and pass a parameter to it
    }
}

, и теперь вы можете генерировать динамически, возможно, используя php, подобный этому

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

, теперь вы можете вызвать функцию, используя динамически сгенерированное событие

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynmicFunction(\"".$name_frm_somware."\");'>";

?>

, точный код HTML вам нужен

<input type="button" value="Button" onclick="runDynmicFunction('runThis_func');">
-1
ответ дан Aylian Craspa 4 September 2018 в 09:20
поделиться

Как указывает Триптих, вы можете вызвать любую глобальную функцию области видимости, найдя ее в содержимом объекта хоста.

Более чистый метод, который значительно загрязняет глобальное пространство имен, заключается в том, чтобы явно включить функции в массив прямо так:

var dyn_functions = [];
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions['populate_Shapes'](1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions.populate_Shapes(1, 2);

Этот массив также может быть свойством какого-либо объекта, кроме глобального объекта-хоста, также означающего, что вы можете эффективно создать собственное пространство имен так, как многие JS-библиотеки, такие как jQuery do , Это полезно для уменьшения конфликтов, если при включении нескольких отдельных библиотек утилиты на одной странице и (в других частях вашего разрешения) можно упростить повторное использование кода на других страницах.

Вы могли бы также используйте такой объект, который вы можете найти более чистым:

var dyn_functions = {};
dyn_functions.populate_Colours = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions.populate_Shapes(1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions['populate_Shapes'](1, 2);

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

var dyn_functions = {
           populate_Colours:function (arg1, arg2) { 
                // function body
           };
         , populate_Shapes:function (arg1, arg2) { 
                // function body
           };
};

Редактирование: конечно, для более крупных блоков функциональности вы можете расширить приведенные выше очень распространенный «шаблон модуля», который является популярным способом инкапсуляции функций кода организованным образом.

30
ответ дан David Spillett 4 September 2018 в 09:20
поделиться
  • 1
    Это хороший способ держать его в чистоте. Как я могу назвать метод? Будет ли работать окно [dyn_functions ['populate_Colours'] (arg1, arg2)? – Chris B 9 June 2009 в 14:19
  • 2
    Отвечая на мой собственный вопрос - я только что протестировал окно [dyn_functions ['populate_Colours'] (arg1, arg2)]; и это действительно работает. – Chris B 9 June 2009 в 15:28
  • 3
    вам не понадобится окно – epascarello 9 June 2009 в 18:48
  • 4
    Как указывает epascarello, вам обычно не нужно «window & quot; - "dyn_functions ['populate_Colours'] (arg1, arg2); & quot; будет работать. Фактически не включая имя глобального объекта сделает код более переносимым, если вы пишете подпрограммы, которые могут когда-либо использоваться в среде JS, отличной от веб-браузера. Однако есть исключение: если у вас есть локальная переменная dyn_functions в функции, тогда вам нужно будет более конкретным, о чем вы говорите, но эту ситуацию лучше избегать (имея разумные соглашения об именах) в любом случае. – David Spillett 9 June 2009 в 20:18
  • 5
    Поскольку этот пост от '09, вы, вероятно, уже знаете это, но вы создаете массив, а затем присваиваете свойства массива (а не индексы). Вы также можете сделать var dyn_functions = {};, чтобы не создавать массив, но это не проблема. – David Sherret 26 November 2013 в 18:46

Попробуйте следующее:

var fn_name = "Colours",
fn = eval("populate_"+fn_name);
fn(args1,argsN);
-2
ответ дан Gilberto 4 September 2018 в 09:20
поделиться
  • 1
    Каковы последствия использования этого шаблона? Я прочитал, что функция eval имеет некоторые более серьезные побочные эффекты, связанные с ее использованием. Я вообще стараюсь держаться подальше от него, если это не последнее средство. – GoldBishop 15 November 2017 в 13:43

Я бы рекомендовал НЕ использовать global / window / eval для этой цели. Вместо этого сделайте это следующим образом:

определите все методы как свойства обработчика:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

Теперь назовите его следующим образом:

var somefunc = "application_run";
Handler[somefunc]('jerry');

Выход: jerry

11
ответ дан JerryGoyal 4 September 2018 в 09:20
поделиться

Привет, попробуйте,

 var callback_function = new Function(functionName);
 callback_function();

он будет обрабатывать сами параметры.

1
ответ дан mathi 4 September 2018 в 09:20
поделиться
  • 1
    неотображаемая эталонная ошибка - functionName не определено – brianlmerritt 26 February 2016 в 10:43
  • 2
    @brianlmerritt вам нужно определить значение для functionName ... ответчик сделал предположение, что вы уже определили это. – GoldBishop 15 November 2017 в 13:41

Внутри ServiceWorker или Worker замените window на self:

self[method_prefix + method_name](arg1, arg2);

Работники не имеют доступа к DOM, поэтому window является недопустимой ссылкой. Для этой цели эквивалентным глобальным идентификатором видимости является self.

0
ответ дан OXiGEN 4 September 2018 в 09:20
поделиться

вы можете сделать это следующим образом:

function MyClass() {
    this.abc = function() {
        alert("abc");
    }
}

var myObject = new MyClass();
myObject["abc"]();
9
ответ дан Simon 4 September 2018 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: