Ну, простыми словами:
Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.
Итак, как это решить:
if (i == null) {
// Handle this
}
Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);
Предполагая, что метод populate_Colours находится в глобальном пространстве имен, вы можете использовать следующий код, который использует оба свойства объекта, к которым можно получить доступ, как если бы объект был ассоциативным массивом и что все глобальные объекты на самом деле являются свойствами объект хоста window
.
var method_name = "Colours";
var method_prefix = "populate_";
// Call function:
window[method_prefix + method_name](arg1, arg2);
Это рабочее и простое решение для проверки существования функции и динамической обработки этой функции другой функцией;
Функция триггера
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');">
Как указывает Триптих, вы можете вызвать любую глобальную функцию области видимости, найдя ее в содержимом объекта хоста.
Более чистый метод, который значительно загрязняет глобальное пространство имен, заключается в том, чтобы явно включить функции в массив прямо так:
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
};
};
Редактирование: конечно, для более крупных блоков функциональности вы можете расширить приведенные выше очень распространенный «шаблон модуля», который является популярным способом инкапсуляции функций кода организованным образом.
var dyn_functions = {};
, чтобы не создавать массив, но это не проблема.
– David Sherret
26 November 2013 в 18:46
Попробуйте следующее:
var fn_name = "Colours",
fn = eval("populate_"+fn_name);
fn(args1,argsN);
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
Привет, попробуйте,
var callback_function = new Function(functionName);
callback_function();
он будет обрабатывать сами параметры.
functionName
... ответчик сделал предположение, что вы уже определили это.
– GoldBishop
15 November 2017 в 13:41
Внутри ServiceWorker
или Worker
замените window
на self
:
self[method_prefix + method_name](arg1, arg2);
Работники не имеют доступа к DOM, поэтому window
является недопустимой ссылкой. Для этой цели эквивалентным глобальным идентификатором видимости является self
.
вы можете сделать это следующим образом:
function MyClass() {
this.abc = function() {
alert("abc");
}
}
var myObject = new MyClass();
myObject["abc"]();
$.fn[method_prefix + method_name](arg1, arg2);
– codecraig 2 June 2011 в 17:27