Как проверить, существует ли функция в 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 Не загружается. Ошибки поджигатель с
меня.onChange-это не функция
Я хочу, чтобы ухудшить изящно, потому что это не самая важная функция в моей программе. typeof дает ту же ошибку.
какие-либо предложения о том, как убедиться, что он существует и тогда только выполнить onChange?
(ни один из методов ниже, кроме try catch one work)
24 ответов:
попробуйте что-то вроде этого:
if (typeof me.onChange !== "undefined") { // safe to use the function }или еще лучше (согласно комментарию UpTheCreek upvoted)
if (typeof me.onChange === "function") { // safe to use the function }
у меня была эта проблема.
if (obj && typeof obj === 'function') { ... }продолжал бросать ссылку на ошибку, если obj оказался неопределенным.
в конце концов я сделал следующее:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }коллега указал мне, что проверка, если это
!== 'undefined'а то=== 'function'- это, конечно, излишним.проще:
if (typeof obj === 'function') { ... }гораздо чище и отлично работает.
Если вы используете eval для преобразования строки в функцию, и вы хотите проверить, существует ли этот метод eval'D, вы захотите использовать typeof и ваша строка функции внутри eval:
var functionString = "nonexsitantFunction" eval("typeof " + functionString) // returns "undefined" or "function"не отменяйте это и попробуйте typeof on eval. Если вы сделаете ReferenceError будет брошен:
var functionString = "nonexsitantFunction" typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
как насчет:
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 docs.
не видел этого предложил: мне.onChange & & me.onChange (str);
в основном, если меня.onChange не определен (что будет, если он не был инициирован), то он не будет выполнять последнюю часть. Если я...onChange-это функция, она будет выполнять меня.onChange (str).
вы даже можете пойти дальше и сделать:
me && me.onChange && me.onChange(str);в случае, если я тоже асинхронный.
попробовать
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
Я пойду на 1 шаг дальше, чтобы убедиться, что свойство действительно является функцией
function js_to_as( str ){ if (me && me.onChange && typeof me.onChange === 'function') { me.onChange(str); } }
//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"); }
мне нравится использовать этот метод:
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 }
без условия
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); }
Я бы заподозрил, что
meне получает правильно назначенный onload.перемещение вызова get_ID в событие onclick должно позаботиться об этом.
очевидно, вы можете дополнительно ловушку, как упоминалось ранее:
function js_to_as( str) { var me = get_ID('jsExample'); if (me && me.onChange) { me.onChange(str); } }
Я всегда проверяю так:
if(!myFunction){return false;}просто поместите его перед любой код, который использует эту функцию
У меня был случай, когда имя функции менялось в зависимости от переменной (var 'x' в этом случае), добавленной к имени функции. Это работает:
if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); }
Подчеркивания.библиотека js определяет его в методе isFunction как это (какие комментарии предполагают, может удовлетворить некоторые Ошибки браузера)
typeof obj == 'function' || false
этот простой код jQuery должен сделать трюк:
if (jQuery.isFunction(functionName)) { functionName(); }
я попробовал принятый ответ; однако:
console.log(typeof me.onChange);возвращает undefined'. Я заметил, что в спецификации указано событие под названием "onchange" вместо "onChange" (обратите внимание на camelCase).
изменение исходного принятого ответа на следующий работал для меня:
if (typeof me.onchange === "function") { // safe to use the function }
для меня самый простой способ :
function func_exists(fname) { return (typeof window[fname] === 'function'); }
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*/ }
вот рабочее и простое решение для проверки существование функции и сортировка этой функции динамически С помощью другой функции;
вызвать функцию
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');">
попробуй это:
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; }помните, что я пишу это с моего мобильного телефона Может содержать некоторые прописные вопросы и / или другие исправления, необходимые, например, функции name
Если вы хотите, чтобы такая функция, как PHP, проверяла, установлен ли var:
Window.isset=function (variable_con){ If(typeof variable_con !== 'undefined') return true; return false; }
чтобы проиллюстрировать предыдущие ответы, вот быстрый 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 */
Если вы проверяете функцию, которая является плагином jQuery, вам нужно использовать $.сноска.myfunction
if (typeof $.fn.mask === 'function') { $('.zip').mask('00000'); }
Comments