Лучший способ определить, когда функция вызывается из консоли


Я хотел бы знать, как лучше всего определить, когда метод или функция вызывается непосредственно через консоль. Насколько я сейчас понимаю, непосредственно обнаружить его при идентичных вызовах функций невозможно, но с помощью методов .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 2

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);, и всякий раз, когда функция вызывается, она выводит сообщение в консоль.