2016-01-31 7 views
0

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

Вот пример кода:

function test(par, callback) { 
    // ... 
    if (typeof callback == 'function') { // make sure the callback is a function 
    callback.call(this); 
    } 

} 

test("par", function() { 
    console.log("Test if in function test: " + "<if this is in function test>"); 
}); 

Это похоже на InstanceOf?

+1

Пожалуйста, соберите его –

+0

Что вы спрашиваете, не имеет ничего общего с ** instanceof **. Возможно, то, что вы ищете, - это устаревшее 'arguments.caller': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller – jfriend00

+0

мой ум рекурсивно зацикливается на этот 8-/... arent вам действительно нужно проверить стек вызовов? это на инструментах разработчика в браузерах – vinjenzo

ответ

1

Там же нестандартный способ сделать это, так как удаление arguments.caller

function test(par, callback) { 
 
    // ... 
 
    if (typeof callback == 'function') { // make sure the callback is a function 
 
    callback.call(this); 
 
    } 
 

 
} 
 

 
test("par", function cb() { 
 
    var isTestCaller = cb.caller === test; 
 
    console.log("Test if in function test: " + isTestCaller); 
 
});

Другим возможным способом сделать это через стеку ошибок (по-прежнему нестандартный):

var checkCaller = function(fnName) { 
 
    var e = new Error(); 
 
    var caller = e.stack.split('\n')[2].trim().split(' ')[1]; 
 
    return caller === fnName; 
 
} 
 

 
function wrapper(){ 
 
    console.log(checkCaller('wrapper')); 
 
} 
 

 
wrapper();

+0

Прохладно это работает, но это также возможно без присвоения функции имени? Спасибо заранее. – janispritzkau

+0

Я включил еще один возможный способ, но я не уверен, насколько хорошо он будет вести себя в браузерах (по крайней мере, 'function.caller' доступен в обычных браузерах) – MinusFour

+0

Вы также можете использовать' arguments.callee', чтобы добраться до анонимная функция 'caller'. Невозможно в строгом режиме. – MinusFour

Смежные вопросы