Как проверить, существует ли функция в JavaScript?
Я следовал этому руководству, чтобы создать новый JS для флэш-связи.
Мой код
function getID( swfID ){
if(navigator.appName.indexOf("Microsoft") != -1){
me = window[swfID];
}else{
me = document[swfID];
}
}
function js_to_as( str ){
me.onChange(str);
}
Однако иногда мой onChange
не загружается. Ошибки Firebug с
me.onChange не является функцией
Я хочу изящно деградировать, потому что это не самая важная функция в моей программе. typeof
выдает ту же ошибку.
Любые предложения о том, как убедиться, что он существует, а затем выполнить только onChange
?
(Ни один из методов ниже, кроме как попробуйте поймать одну работу)
Ответы
Ответ 1
Попробуйте что-то вроде этого:
if (typeof me.onChange !== "undefined") {
// safe to use the function
}
или еще лучше (в соответствии с комментариями UpTheCreek вверх)
if (typeof me.onChange === "function") {
// safe to use the function
}
Ответ 2
У меня была эта проблема.
if (obj && typeof obj === 'function') { ... }
продолжал бросать опорную ошибку, если obj оказался undefined.
В конце я сделал следующее:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }
Коллега указал мне, что проверка, если он !== 'undefined'
, а затем === 'function'
, конечно, избыточен.
Simpler:
if (typeof obj === 'function') { ... }
Значительно чище и отлично работает.
Ответ 3
Изменить: я не претендую на то, чтобы знать причину (причины), почему этот ответ является принятым. Вместо этого используйте предложенное решение в Andrew Hare: fooobar.com/questions/25657/...
Вот один из способов справиться с такой ситуацией:
function js_to_as( str ){
try {
me.onChange(str);
}
catch(err) {
// Handle error(s) here
}
}
Ответ 4
Если вы используете eval для преобразования строки в функцию, и вы хотите проверить, существует ли этот метод eval'd, вам нужно использовать typeof, а вашу строку функций внутри Eval
var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"
Не отменяйте это и попробуйте typeof на eval. Если вы сделаете ReferenceError, вы будете брошены:
var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
Ответ 5
Как насчет:
if('functionName' in Obj){
//code
}
например,
var color1 = new String("green");
"length" in color1 // returns true
"indexOf" in color1 // returns true
"blablabla" in color1 // returns false
или как в вашем случае:
if('onChange' in me){
//code
}
См. документы MDN.
Ответ 6
Попробуйте typeof
- ищите 'undefined'
, чтобы сказать, что он не существует, 'function'
для функции. JSFiddle для этого кода
function thisishere() {
return false;
}
alert("thisishere() is a " + typeof thisishere);
alert("thisisnthere() is " + typeof thisisnthere);
Или как будто:
if (typeof thisishere === 'function') {
// function exists
}
Или с возвращаемым значением в одной строке:
var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false";
var exists = (typeof thisishere === 'function') // Returns true or false
Ответ 7
Не видел этого: me.onChange && me.onChange(ул);
В принципе, если me.onChange - undefined (который будет, если он не был инициирован), то он не будет выполнять последнюю часть. Если me.onChange - это функция, она выполнит me.onChange(str).
Вы даже можете пойти дальше и сделать:
me && me.onChange && me.onChange(str);
если я также асинхронный.
Ответ 8
Я сделаю еще один шаг, чтобы убедиться, что свойство действительно является функцией
function js_to_as( str ){
if (me && me.onChange && typeof me.onChange === 'function') {
me.onChange(str);
}
}
Ответ 9
//Simple function that will tell if the function is defined or not
function is_function(func) {
return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}
//usage
if (is_function("myFunction") {
alert("myFunction defined");
} else {
alert("myFunction not defined");
}
Ответ 10
Для меня самый простой способ:
function func_exists(fname)
{
return (typeof window[fname] === 'function');
}
Ответ 11
Мне нравится использовать этот метод:
function isFunction(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
Использование:
if ( isFunction(me.onChange) ) {
me.onChange(str); // call the function with params
}
Ответ 12
Библиотека Underscore.js определяет ее в методе isFunction как это (в предложениях для комментариев могут быть учтены некоторые ошибки браузера)
typeof obj == 'function' || false
http://underscorejs.org/docs/underscore.html#section-143
Ответ 13
function js_to_as( str ){
if (me && me.onChange)
me.onChange(str);
}
Ответ 14
Без условий
me.onChange=function(){};
function getID( swfID ){
if(navigator.appName.indexOf("Microsoft") != -1){
me = window[swfID];
}else{
me = document[swfID];
}
}
function js_to_as( str ){
me.onChange(str);
}
Ответ 15
Я бы заподозрил, что me
не получает корректно назначенного onload.
Перемещение вызова get_ID в событие onclick должно позаботиться об этом.
Очевидно, вы можете еще больше уловить, как упоминалось ранее:
function js_to_as( str) {
var me = get_ID('jsExample');
if (me && me.onChange) {
me.onChange(str);
}
}
Ответ 16
Я всегда проверяю следующее:
if(!myFunction){return false;}
просто поместите его перед любым кодом, который использует эту функцию
Ответ 17
Я имел случай, когда имя функции менялось в соответствии с переменной (var 'x' в этом случае), добавленной к имени функции. Это работает:
if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); }
Ответ 18
Этот простой код jQuery должен сделать трюк:
if (jQuery.isFunction(functionName)) {
functionName();
}
Ответ 19
Я пробовал принятый ответ; Однако:
console.log(typeof me.onChange);
возвращает 'undefined'.
Я заметил, что в спецификации указано событие, называемое "onchange" вместо "onChange" (обратите внимание на camelCase).
Изменение исходного принятого ответа на следующее сработало для меня:
if (typeof me.onchange === "function") {
// safe to use the function
}
Ответ 20
function function_exists(function_name)
{
return eval('typeof ' + function_name) === 'function';
}
alert(function_exists('test'));
alert(function_exists('function_exists'));
ИЛИ
function function_exists(func_name) {
// discuss at: http://phpjs.org/functions/function_exists/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// improved by: Steve Clay
// improved by: Legaev Andrey
// improved by: Brett Zamir (http://brett-zamir.me)
// example 1: function_exists('isFinite');
// returns 1: true
if (typeof func_name === 'string') {
func_name = this.window[func_name];
}
return typeof func_name === 'function';
}
Ответ 21
Поставь двойной восклицательный знак т.е. перед именем функции, которую вы хотите проверить. Если он существует, он вернет true.
function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false
Ответ 22
Если вы проверяете функцию, которая является плагином jQuery, вам нужно использовать $.fn.myfunction
if (typeof $.fn.mask === 'function') {
$('.zip').mask('00000');
}
Ответ 23
function sum(nb1,nb2){
return nb1+nb2;
}
try{
if(sum() != undefined){/*test if the function is defined before call it*/
sum(3,5); /*once the function is exist you can call it */
}
}catch(e){
console.log("function not defined");/*the function is not defined or does not exists*/
}
Ответ 24
И тогда есть это...
( document.exitPointerLock || Function )();
Ответ 25
Вот работающее и простое решение для проверки существования функции и динамического запуска этой функции другой функцией;
Функция запуска
function runDynamicFunction(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='runDynamicFunction(\"".$name_frm_somware."\");'>";
?>
точный HTML-код, который вам нужен, это
<input type="button" value="Button" onclick="runDynamicFunction('runThis_func');">
Ответ 26
Попробуйте это:
Window.function_exists=function(function_name,scope){
//Setting default scope of none is provided
If(typeof scope === 'undefined') scope=window;
//Checking if function name is defined
If (typeof function_name === 'undefined') throw new
Error('You have to provide an valid function name!');
//The type container
var fn= (typeof scope[function_name]);
//Function type
If(fn === 'function') return true;
//Function object type
if(fn.indexOf('function')!== false) return true;
return false;
}
Имейте в виду, что я пишу это с моим мобильным телефоном
Может содержать некоторые проблемы в верхнем регистре и/или другие исправления, такие как, например, имя функции
Если вы хотите, чтобы такая функция, как PHP, проверяла, установлена ли переменная:
Window.isset=function (variable_con){
If(typeof variable_con !== 'undefined') return true;
return false;
}
Ответ 27
Чтобы проиллюстрировать предыдущие ответы, приведу краткий фрагмент JSFiddle:
function test () {
console.log()
}
console.log(typeof test) // >> "function"
// implicit test, in javascript if an entity exist it returns implcitly true unless the element value is false as :
// var test = false
if(test){ console.log(true)}
else{console.log(false)}
// test by the typeof method
if( typeof test === "function"){ console.log(true)}
else{console.log(false)}
// confirm that the test is effective :
// - entity with false value
var test2 = false
if(test2){ console.log(true)}
else{console.log(false)}
// confirm that the test is effective :
// - typeof entity
if( typeof test ==="foo"){ console.log(true)}
else{console.log(false)}
/* Expected :
function
true
true
false
false
*/
Ответ 28
Я также искал элегантное решение этой проблемы. После долгих размышлений я нашел этот подход лучше всего.
const func = me.onChange || (str => {});
func(str)
;