如何使用 Javascript 检查另一个函数中是否存在函数

How to check if function exists inside another function using Javascript

提问人:Bruno Natali 提问时间:3/25/2020 更新时间:3/25/2020 访问量:1994

问:

我正在尝试构建一个按需加载脚本的函数。这是我当前的代码:

function loadScript(src, name = null)
{
    var dfd = jQuery.Deferred();

    if (name === null) {
        name = src.split(/\\|\//); // split by folder separator 
        name = name[(name.length - 1)].split('.'); // catch last index & split by extension 
        name.splice(name.length - 1, 1) // Remove last
        name = name.join('.'); // add points in the middle of file name
    }

    if ( typeof name === 'function' ) return dfd.promise().resolve(name);

    $.getScript( src )
    .done(function( script, textStatus ) {
        dfd.resolve(name);
    })
    .fail(function( jqxhr, settings, exception ) {
        dfd.reject(exception);
    });

    return dfd.promise();
}

我的问题出在代码的这一部分:

if ( typeof name === 'function' ) return dfd.promise().resolve(name);

其中 name 是一个变量,其中包含要检查的所需函数名称,但不是真正的函数名称,导致函数从不计算为“function”。

我试过了:

typeof `${name}` // resulting a "string" 

eval("typeof name === 'function'") // But my node system not accept eval due to a potentially security risk

我有多少种选择?

javascript jquery 函数 variable-variables

评论

0赞 Barmar 3/25/2020
如果是全局函数,请使用window[name]
0赞 Guerric P 3/25/2020
该函数在哪里声明?
0赞 Bruno Natali 3/25/2020
可以使用 Jquery $.getScript 在此函数中加载函数。但是window[name]是'undefined',即使在使用'getScript'加载之后也是如此

答:

0赞 Guerric P 3/25/2020 #1

你可以做,或者如果函数是全局的,typeof eval(name) === functiontypeof window[name] === function

演示:

(function() {
    function test() {}
    (function(name) {
        console.log(typeof eval(name) === 'function');
    })('test');
})();

评论

0赞 Bruno Natali 3/25/2020
正如我所说,eval() 不是替代方案
0赞 Guerric P 3/25/2020
好吧,我读得太快了,那么除非它是一个全局函数,或者除非它附加到一个特定的对象,否则这是不可能的,是吗?
0赞 Bruno Natali 3/25/2020
我真的不知道,我用Jquery getScript动态加载脚本。此脚本包含类或函数。为了防止重新声明函数,如果需要评估并防止脚本再次加载。
0赞 Guerric P 3/25/2020
好的,那么你要找的函数必须是全局的。你试过了吗?typeof window[name] === function
0赞 David Watson 3/25/2020 #2

简单快速:

if ( typeof name === 'string' && typeof eval(name) === 'function' ) return dfd.promise().resolve(name);

因为在将名称传递给 Eval 之前,您可能希望仔细检查该名称实际上是 A。如果它来自用户输入,您可能还想进一步验证它,因为您可能会向脚本注入敞开心扉。

0赞 OO7 3/25/2020 #3

希望这可以帮助任何人;

const getFunc = (s) => {
   const a = s.split(".");
   let obj = window, i = 0;
   while (i < a.length && (obj = obj[a[i++]]) !== undefined);
   if (typeof obj === "function") return obj;
};

console.log(getFunc("Infinity.isFloat"));