Как проверить, существует ли функция в 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 с
меня.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 на и ваша строка функции внутри оценку:
var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"
не отменяйте это и попробуйте typeof на on оценку. Если вы сделаете 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, после чего && меня.onChange (str);
в основном, если меня.onChange не определен (что будет, если он не был инициирован), то он не будет выполнять последнюю часть. Если я.onChange-это функция, она будет выполнять меня.onChange, после чего(ул.).
вы даже можете пойти дальше и сделать:
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');
}