Как проверить, существует ли функция в 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)

410   24  

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
}
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}

без условия

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

http://underscorejs.org/docs/underscore.html#section-143

этот простой код 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*/
    }

и тогда есть это...

( document.exitPointerLock || Function )();

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

вызвать функцию

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

    Ничего не найдено.