Как проверить, существует ли функция внутри другой функции, используя Javascript - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать функцию, которая загружает скрипт по требованию. Это мой текущий код:

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);

Где имя - это переменная, которая содержит имя нужной функции для проверки, но не реальное имя функции, в результате чего функция никогда не оценивается как «функция».

Я пробовал:

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

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

Сколько альтернатив у меня есть?

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Быстро и грязно:

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

, так как вы, вероятно, хотите перепроверить, что это имя на самом деле перед передачей его в eval. Возможно, вы также захотите дополнительно проверить его, если он поступает от пользовательского ввода, так как вы можете открывать себя для инъекций скрипта.

0 голосов
/ 25 марта 2020

Надеюсь, это может кому-нибудь помочь;

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"));
0 голосов
/ 25 марта 2020

Вы можете сделать typeof eval(name) === function или, если функция глобальная, typeof window[name] === function

Демо:

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