检测何时从控制台调用函数的最佳方法
Best way to detect when a function is called from the console
我想知道检测何时通过控制台直接调用方法或函数的最佳方法。据我目前所知,不可能在相同的函数调用上直接检测到它,但是使用函数的 .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);
在我的实际代码中区分了从控制台直接调用和我自己的代码,但这显然不是万无一失的,因为同样的代码也可以从控制台执行以达到预期的效果。
我想要一种方法能够从两个地方调用函数,然后区分调用的位置。如果没有办法做到这一点,尝试阻止执行的最佳方法是什么?最好根本不公开任何方法,并将所有内容保存在一个封闭的匿名函数中吗?
要防止全局访问,请确保您的代码处于闭包中。如果你想公开一个 API 你可以使用 module pattern.
关闭
(function() {
var Game = {};
Game.giveMoney = function(money) {
console.log('Gave money (' + money + ')');
};
})();
将所有 private 代码包装在 IIFE (Immediately Invoked Function Expression) 它将把它锁定到一个闭包中。
模块
然后仅将自定义函数公开回闭包,以便您可以在控制台上使用它们(当然需要监督)。
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);
每当调用该函数时,它都会在控制台中输出一条消息。
我想知道检测何时通过控制台直接调用方法或函数的最佳方法。据我目前所知,不可能在相同的函数调用上直接检测到它,但是使用函数的 .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);
在我的实际代码中区分了从控制台直接调用和我自己的代码,但这显然不是万无一失的,因为同样的代码也可以从控制台执行以达到预期的效果。
我想要一种方法能够从两个地方调用函数,然后区分调用的位置。如果没有办法做到这一点,尝试阻止执行的最佳方法是什么?最好根本不公开任何方法,并将所有内容保存在一个封闭的匿名函数中吗?
要防止全局访问,请确保您的代码处于闭包中。如果你想公开一个 API 你可以使用 module pattern.
关闭
(function() {
var Game = {};
Game.giveMoney = function(money) {
console.log('Gave money (' + money + ')');
};
})();
将所有 private 代码包装在 IIFE (Immediately Invoked Function Expression) 它将把它锁定到一个闭包中。
模块
然后仅将自定义函数公开回闭包,以便您可以在控制台上使用它们(当然需要监督)。
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);
每当调用该函数时,它都会在控制台中输出一条消息。