Лучший способ определить, когда функция вызывается из консоли
Я хотел бы знать, как лучше всего определить, когда метод или функция вызывается непосредственно через консоль. Насколько я сейчас понимаю, непосредственно обнаружить его при идентичных вызовах функций невозможно, но с помощью методов .call()
и .apply()
функции я могу передавать дополнительные данные через объект this
.
Задается следующая структура кода:
(function(){
var Player = {money: 0};
window.giveMoney = function(amount){
if (this.legit !== true)
throw new Error("Don't try to cheat!");
Player.money += amount;
}
})();
Я мог бы вызвать функцию, используя
window.giveMoney.call({legit: true}, 300);
В моем фактическом коде, чтобы сказать прямой вызов с консоли и мой собственный код отдельно, но это явно не защита от дураков, так как тот же код также может быть выполнен с консоли для достижения желаемого эффекта.
Я хотел бы иметь возможность вызывать функцию из обоих мест, а затем отличать места вызова друг от друга. Если нет способа сделать это, то как лучше всего попытаться предотвратить казнь? Может быть, лучше вообще не раскрывать никаких методов и держать все внутри одной закрытой анонимной функции?
3 ответа:
Чтобы предотвратить глобальный доступ, убедитесь, что ваш код находится в закрытом состоянии. Если вы хотите предоставить API, вы можете сделать это с помощью шаблона модуля .
Закрытие
(function() { var Game = {}; Game.giveMoney = function(money) { console.log('Gave money (' + money + ')'); }; })();
Оберните весь ваш частный код в IIFE (I mmediately I nvoked F unction E xpression), который замкнет его в замкнутое состояние.
Модуль
Затем предоставьте только пользовательские функции обратно из закрытия, чтобы вы могли использовать их на консоль (с наблюдением, конечно).
window.Game = (function() { var player = { money: 500; }; player.giveMoney = function(money) { console.log('Gave money (' + money + ')'); player.money += money; }; player.takeMoney = function(money) { console.log('Took money (' + money + ')'); player.money -= money; }; return { giveMoney: function(money) { console.error('Don\'t Cheat! A fine was charged.'); player.takeMoney(Math.floor(player.money / 0.05)); } }; })(); window.Game.giveMoney(200);
Вы можете передавать все вызовы функций через центральную точку доступа с помощью булевой переменной, которая может служить индикатором, является ли вызов консольным или нет....
var maths = { add: function(p1,p2) { console.log(p1,p2); } } var invoker = { invoke: function(fu,isconsole) { if(isconsole) { console.log("Called from console"); } //invokes the function with all parameters intact fu; } } //Call without console invoker.invoke(maths.add(2,3)); //Call with console invoker.invoke(maths.add(2,3),true);
Надеюсь, это поможет!!!
Вы можете использовать команду monitor() в консоли для отслеживания вызова функции. https://developer.chrome.com/devtools/docs/commandline-api#monitorfunction
Просто запустите
monitor(functionName);
, и всякий раз, когда функция вызывается, она выводит сообщение в консоль.