如何检查JavaScript中是否存在函数?

2020/09/24 06:21 · javascript ·  · 0评论

我的代码是

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无法加载。萤火虫错误

me.onChange不是一个函数

我想优雅地降级,因为这不是我程序中最重要的功能。typeof给出相同的错误。

关于如何确保它存在然后仅执行的任何建议onChange

(下面的任何一种方法都不能尝试抓到一件作品)

尝试这样的事情:

if (typeof me.onChange !== "undefined") { 
    // safe to use the function
}

或更好(根据UpTheCreek推荐的评论)

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方法是否存在,则需要eval中使用typeof和函数字符串

var functionString = "nonexsitantFunction"
eval("typeof " + functionString) // returns "undefined" or "function"

不要颠倒这个,eval尝试使用typeof如果执行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文档

尝试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

没看到这个建议:me.onChange && me.onChange(str);

基本上,如果me.onChange是未定义的(如果尚未启动,它将是未定义的),则它将不执行后一部分。如果me.onChange是一个函数,它将执行me.onChange(str)。

您甚至可以走得更远,并执行以下操作:

me && me.onChange && me.onChange(str);

万一我也是异步的。

对我来说,最简单的方法是:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}
//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");
    }

用现代Java语言解救!

现在可以使用新的Optional Chaining语法在Java语言(和Typescript)的语言级别解决*

me.onChange?.(str)

就这么简单- onChange仅在存在时才被调用

如果onChange不存在,则什么也不会发生,并且表达式返回undefined因此,如果有value您本来会使用的退货,则可以value !== undefined在继续之前检查一下

边缘的情况下警告-如果onChange 确实存在,但不是一个功能,你会得到一个TypeError正如您所期望的那样,它与尝试将任何非函数作为函数调用相同,但是值得明确指出的是,“可选链接”并不能起到任何作用。

*嗯,从技术上讲,“可选链接”仍是TC39第4阶段提案,因此尚未在ECMAScript规范中提出,但第4阶段意味着已完成定稿,并且基本上可以保证包含它,它只是在等待新版本发布。您可以立即通过Babel在其最终版本中使用该语法,并确信它不会更改。它也在Typescript中。

我将更进一步以确保该属性确实是一个函数

function js_to_as( str ){
     if (me && me.onChange && typeof me.onChange === 'function') {
         me.onChange(str);
     }
}
function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}

我喜欢使用这种方法:

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
}

Underscore.js库在isFunction方法中以此定义它(此注释建议可能会解决一些浏览器错误)

typeof obj == 'function' || false

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

如果您要检查的是jQuery插件的功能,则需要使用$ .fn.myfunction

if (typeof $.fn.mask === 'function') {
    $('.zip').mask('00000');
}
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';
}

把双感叹号,即!要检查的函数名称之前。如果存在,它将返回true。

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false

无条件

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](); } 

This simple jQuery code should do the trick:

if (jQuery.isFunction(functionName)) {
    functionName();
}

I have tried the accepted answer; however:

console.log(typeof me.onChange);

returns 'undefined'.
I've noticed that the specification states an event called 'onchange' instead of 'onChange' (notice the camelCase).

Changing the original accepted answer to the following worked for me:

if (typeof me.onchange === "function") { 
  // safe to use the function
}

I have also been looking for an elegant solution to this problem. After much reflection, I found this approach best.

const func = me.onChange || (str => {});
func(str)
;

简而言之:捕获异常。

我真的很惊讶,目前还没有人回答或评论有关Exception Catch的内容。

详细信息:这是一个示例,在该示例中,我尝试匹配以mask_为前缀并以字段“ name”为后缀的函数。当JavaScript未找到该函数时,它应该引发一个ReferenceError,您可以根据需要在catch部分处理该错误。

function inputMask(input) {
  try {
    let maskedInput = eval("mask_"+input.name);

    if(typeof maskedInput === "undefined")
        return input.value;
    else
        return eval("mask_"+input.name)(input);

  } catch(e) {
    if (e instanceof ReferenceError) {
      return input.value;
    }
  }
}

这里是一个工作和用于检查简单的解决方案的功能的存在动态地触发该功能的另一个功能;

触发功能

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');">
    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 )();

试试这个:

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之类的函数来检查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
*/
// just pass your tested function name instead of myFunctionName
if ( $.isFunction($.fn.myFunctionName) ) {
    console.log( 'write your code here.' );
}
本文地址:http://javascript.askforanswer.com/ruhejianchajavascriptzhongshifoucunzaihanshu.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!