2

我想知道检测何时通过控制台直接调用方法或函数的最佳方法。据我目前了解,不可能在相同的函数调用中直接检测到它,但是使用函数的.call()and.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);

在我的实际代码中将直接从控制台调用和我自己的代码区分开来,但这显然不是万无一失的,因为同样的代码也可以从控制台执行以达到预期的效果。

我想要一种能够从两个地方调用该函数的方法,然后将调用的位置分开。如果没有办法做到这一点,那么尝试阻止执行的最佳方法是什么?最好根本不公开任何方法,并将所有内容保存在一个封闭的匿名函数中吗?

4

3 回答 3

3

为了防止全局访问,请确保您的代码处于闭包中。如果你想公开一个 API,你可以使用模块模式

关闭

(function() {
  var Game = {};
  Game.giveMoney = function(money) {
    console.log('Gave money (' + money + ')');
  };
})();

将您所有的私有代码包装在一个IIFE 立即调用函数表达式),这会将其锁定在一个闭包中。

模块

然后只从闭包中公开自定义函数,以便您可以在控制台上使用它们(当然需要监督)。

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);
于 2015-01-17T14:50:44.573 回答
0

您可以通过带有布尔变量的中央访问点对所有函数调用进行假脱机处理,该变量可以作为调用是否来自控制台的指示器......

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

希望能帮助到你!!!

于 2015-01-17T16:18:53.923 回答
0

您可以在控制台中使用 monitor() 命令来监控函数何时被调用。https://developer.chrome.com/devtools/docs/commandline-api#monitorfunction

只需运行monitor(functionName);,无论何时调用该函数,它都会在控制台中输出一条消息。

于 2015-02-19T19:59:56.323 回答