Обычай использовать строгие директивы как
Я ищу лучший способ ведения журнала / отладки для моего проекта. Поэтому мне пришла в голову идея использовать пользовательские директивы, такие как "использовать строгий".
Можно ли написать что-то подобное
function xyz () {
'loglevel: info';
/// Some other code
logging.debug("foobar");
}
И если xyz имеет директиву loglevel >= info, logging.debug не будет регистрировать сообщение.
Это возможно?
2 ответа
Нет, вы не можете создавать такие директивы без каких-либо реальных попыток преобразования текущей функции в строку и проверки директивы. не стоит тратить время на проверку. Тем не менее, вы можете использовать функциональные декораторы для выполнения той же функции, немного сложно разобраться, но очень мощно, когда вы это делаете.
Я должен отметить, что в es7 будет проще реализовать декораторы. Они все еще созданы таким же образом. Они являются функцией, которая возвращает функцию вместо исходной функции. но у них есть сахар, например.
извините, я не мог остановиться, поэтому пошел немного далеко. но теперь это довольно полный пример.
@logLevel('warn')
function xyz(){
// do some stuff
}
или же
@logLevelInfo
function abc(){
// do some stuff
}
// if this is false the logging will not occur
var __debug__ = true;
var __debug_levels__ = ['error', 'warn'];
// decorator to create a log level function. this is a function
// that takes the log type, that returns a function that takes the
// function you want to decorate with the logging functionality
// that returns the decorated function that you call as xyz( ...arguments ).
function logLevel( type ) {
return function logger(fn) {
return function() {
// save time if __debug__ is false
if( __debug__ ){
// run the decorated function and get the result
// may as well wrap it in a try catch in case there are any errors
try {
var result = fn.apply(this, arguments);
} catch( e ){
console.error( e );
}
if( __debug_levels__.indexOf( type ) > -1 ){
// log the result to the console or whatever functionality you require
console[ type || 'log' ](result);
}
// return the result so you can do something with the result
return result;
}
return fn.apply(this, arguments);
}
}
}
// this will return the first function that takes the function to decorate
var logLevelInfo = logLevel('warn');
var logLevelDebug = logLevel('error');
// here we are using the decorators to wrap the original function
var xyz = logLevelInfo(function xyz( arg ) {
return arg + 'bar';
});
// same here but we are using the other decorator
var abc = logLevelDebug(function abc( arg ){
return arg + 'baz';
});
// these functions have been decorated to perform the logging
// functionality on the returned result
xyz('foo'); //=> 'foobar'
abc('foo'); //=> 'foobaz'
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>
function Log(level)
{
var levels = { 'debug': 10, 'info': 20};
function write(lvl)
{
var handle = function(msg)
{
if (levels[lvl] <= levels[level])
console.log(lvl + ': ' + msg);
};
return handle;
}
for (var i in levels)
{
this[i] = write(i);
}
}
var log1 = new Log('info');
log1.info('hello'); // will result with an output
log1.debug('hello'); // still has an output output
var log2 = new Log('debug');
log2.info('hello'); // no output here