我想创建我自己的console.log版本,使用'咖喱'功能,并包括显示或不显示日志的可能性。 (激发了SecretsOfTheJavascriptNinja)使用闭包|创建我自己的console.log版本Javascript
因此,我使用闭包来实现这样的功能:
Function.prototype.conditionalCurry = function() {
var fn = this;
var args = Array.prototype.slice.call(arguments);
var show = args[0];
args = args.slice(1, args.length);
return function() {
if (show) {
return fn.apply(this, args.concat(
Array.prototype.slice.call(arguments)));
}
else return;
};
};
当我在它工作的终端中使用节点测试的代码:
var newLog = console.log.conditionalCurry(true, 'Always visible|');
newLog('log visible'); // gives on the console: Always visible| log visible
newLog = console.log.conditionalCurry(false, 'never visible|');
newLog('log visible'); // gives nothing, it works!
但是,当我测试代码在Chrome 48.0.2564.109和Firefox 44.0.2上出现了问题,我认为在这两种情况下都是一样的。
据我所知,当我在终端中使用节点时,以某种方式将传递给函数conditionalCurry的上下文'this'是一个匿名函数,但在浏览器的情况下'this'显示为一个函数'日志“,我相信这是破坏代码。
任何想法如何在浏览器中实现此功能?
在此先感谢!
随着BERGI的解决方案,现在它的工作原理:Fiddle
使用'console.log.bind(控制台).conditionalCurry(...)' – Bergi
感谢@Bergi它的作品开箱! 让我看看我是否明白。控制台对象的方法log()需要访问控制台的上下文来工作,他们自己的关闭是什么。 因此,当我在console.log上调用conditionalCurry时,获取并存储在fn变量中的上下文是log()函数中的一个变量。 那么当我调用newLog时,它不能打印任何东西,因为。日志无法访问通常具有的闭包,导致我的fn变量引用了log()上下文,而不是控制台上下文...我很接近?谢谢! – Javingka
“*原因.log无法访问通常具有*的闭包 - ”不,闭包变量在这里并不重要(无论如何,您都可以从外面混淆它们)。只有['this' context](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)是预期的一个 - 一个'Console'实例是非常重要的。 – Bergi