Помоги с укрытыми функциями Javascript

У меня есть страница, которую загружает Javascript и это содержит:

(function(f) {
    function qb(a) {
        var b = g.sockets[a];
        b.onopen = b.onclose = b.onmessage = b.onerror = function() {};
        for (var d = 0; d < b.events.length; ++d) U(b.events[d][1]);
        b.events = null;
        try {
            b.close()
        } catch (t) {}
        g.sockets[a] = null
    }

    function tb(a) {
        eval.call(null, a)
    }

})

Я хотел бы знать, как я звоню в функцию tb из консоли chrome, потому что у меня выходит следующая ошибка VM3784:1 Ункаугт Референсееррор: tb is not defined (…)

3
задан 11.08.2017, 01:31
3 ответа

Хорошие, ты не можешь, благодаря тому, что он внутри анонимной функции, только можешь видеть debug (F12 в браузере, чтобы доставать консоль) и помещать breakpoint внутри.

У тебя есть функция, укрытая внутри другой, эти функции обычно приносят имя inner-private, они inner, потому что они внутренние, и лиши тебя, потому что они только доступные с кода функции.

Я оставляю тебе страницу для того, чтобы ты это понял лучше.

http://www.cristalab.com/tutoriales/funciones-en-javascript-variables-objetos-y-anonimas-c111051l/

3
ответ дан 24.11.2019, 12:15

Как он сказал @sakulino, не изменяя кода, не возможно если только ты не сделаешь какой-то eval () hack с рукописным шрифтом. Если ты можешь изменять это, идеальное будет состоять в том, чтобы ты выставил внутренние функции:

var f = (function(f) {
    function qb(a) {
        var b = g.sockets[a];
        b.onopen = b.onclose = b.onmessage = b.onerror = function() {};
        for (var d = 0; d < b.events.length; ++d) U(b.events[d][1]);
        b.events = null;
        try {
            b.close()
        } catch (t) {}
        g.sockets[a] = null
    }

    function tb(a) {
        eval.call(null, a)
    }
    return {
        qb: qb,
        tb: tb
    }
})();

f.gb();
f.tb();
3
ответ дан 24.11.2019, 12:15

Я рекомендую тебе работать в самом меньшем возможном средстве с анонимными функциями. Верно, что они предлагают много удобства во время работы, но могут превращаться в проблему. Он немного "послушнее", если они имеются в объекте, к которому ты это можешь относиться с большей гибкостью. В случае твоего кода, просто не надо использовать укрытые функции. Например:

function qb(a) {
    var b = g.sockets[a];
    b.onopen = b.onclose = b.onmessage = b.onerror = function() {};
    for (var d = 0; d < b.events.length; ++d) U(b.events[d][1]);
    b.events = null;
    try {
        b.close()
    } catch (t) {}
    g.sockets[a] = null
}

function tb(a) {
    eval.call(null, a)
}

Я думаю, что не было бы необходимым объявлять функции внутри функций, если они не будут работать прямо с внутренними данными о самой внешней функции.

1
ответ дан 24.11.2019, 12:15