我现在正在开发一个应用程序,并放置一个全局isDebug开关.我想换行console.log以方便使用.
//isDebug controls the entire site.
var isDebug = true;
//debug.js
function debug(msg, level){
var Global = this;
if(!(Global.isDebug && Global.console && Global.console.log)){
return;
}
level = level||'info';
Global.console.log(level + ': '+ msg);
}
//main.js
debug('Here is a msg.');
Run Code Online (Sandbox Code Playgroud)
然后我在Firefox控制台中得到了这个结果.
info: Here is a msg. debug.js (line 8)
Run Code Online (Sandbox Code Playgroud)
如果我想用debug()被调用的行号记录,info: Here is a msg. main.js (line 2)怎么办?
JavaScript是否有一种机制来确定当前正在执行的语句的行号(如果是,它是什么)?
我正在为我的网络应用程序构建调试工具,我需要在div中显示控制台错误.我知道我可以使用我自己制作的控制台,如对象并使用它,但为了将来使用,我需要将所有控制台错误发送到窗口.其实我想抓住控制台事件.
如何编写控制台日志包装器:
由于登录Java Script是如此不一致,因此必须有一些解决方案.自己实现它有点乏味,但似乎没有好的库.
我目前发现这个记录器提供了所有功能,但它确实搞乱了行号.http://benalman.com/projects/javascript-debug-console-log/
我在Javascript中定义自定义错误对象时发现了一个奇怪的行为:
function MyError(msg) {
Error.call(this, msg);
this.name = "MyError";
}
MyError.prototype.__proto__ = Error.prototype;
var error = new Error("message");
error.message; // "message"
var myError = new MyError("message");
myError instanceof Error; // true
myError.message; // "" !
Run Code Online (Sandbox Code Playgroud)
为什么new Error("message")设置message属性,而Error.call(this, msg);不是?当然,我可以this.message = msg在MyError构造函数中定义,但我不太明白为什么它还没有设置在第一位.
function log( msgOrObj ){
if(dev_mode){
console.log({
'message': msgOrObj,
'caller': arguments.callee.caller.toString()
});
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最多就是调用它的函数.
有没有人做过类似的事情?或者这甚至可能吗?
第70行的somescript.js中使用的示例:
log('some very important message!')
Run Code Online (Sandbox Code Playgroud) 在使用越来越多的JavaScript代码处理更大的Web应用程序时,我们就如何提高代码质量进行了头脑风暴会议.
最初的想法之一是引入单元测试.这将是一个长期目标; 但是,这不会解决最常见的回归原因:更改DOM和浏览器特定问题.
单元测试在模拟的无DOM环境中运行,不在页面上.
我正在寻找的是一个断言框架,可以插入代码中,如下所示:
var $div = $("div.fooBarClass");
assertNotEmpty($div);
$div.fooBarAction();
Run Code Online (Sandbox Code Playgroud)
我发现断言框架可以做到这一点,但它们都可以登录控制台或进入DOM或打开一个愚蠢的弹出窗口.这些都不与(数千个)自动化测试一起工作. 我正在寻找的是一个运行时断言框架,它通过AJAX记录失败的断言!理想情况下,它应该是:
在Python中工作时,我总是有这个简单的实用程序函数,它返回调用函数的文件名和行号:
from inspect import getframeinfo, stack
def d():
""" d stands for Debug. It returns the file name and line number from where this function is called."""
caller = getframeinfo(stack()[1][0])
return "%s:%d -" % (caller.filename, caller.lineno)
Run Code Online (Sandbox Code Playgroud)
所以在我的代码中我只是简单地放了几个这样的调试行来看看在发生错误之前我们得到了多少:
print d()
# Some buggy code here
print d()
# More buggy code here
print d(), 'here is the result of some var: ', someVar
Run Code Online (Sandbox Code Playgroud)
这对我来说非常有用,因为它确实有助于快速调试.
我现在正在寻找节点后端脚本中的等价物.我在寻找,但我找不到任何有用的东西(也许我在寻找错误的词?).
有谁知道如何创建一个Javascript/nodejs函数,它输出调用函数的文件名和行号?欢迎所有提示!
引用此问题,我正在使用以下代码来查找我的自定义日志记录函数的调用方的行号:
/**
* eLog - displays calling line number & message & dumps vars as pretty json string
* @param {string} msg - string to display in log message
* @param {any} dispVars - any number of variables (ellipsis , aka Rest parameters) to dump
*/
function eLog(msg:string,...dispVars:any[]){
let caller_line = (new Error).stack.split("\n")[4];
console.log(`eLog->Line#${caller_line}->${msg}->`);
console.log(JSON.stringify((new Error).stack.split("\n"),null,2));
dispVars.forEach(value => {
console.log(JSON.stringify(value,null,2));
});
}
Run Code Online (Sandbox Code Playgroud)
这样称呼:
eLog("eLog Test",this);
Run Code Online (Sandbox Code Playgroud)
尽管这样做确实可以正确转储.js文件行号,但我需要源行号(.ts行号)。如何正确生成?
我已经构建了一个自定义日志记录实用程序,它显示了日志消息和日期时间.我想在调用该函数的源代码中添加行号.
有没有办法确定特定的javascript函数被触发的HTML源代码行?
javascript ×10
node.js ×2
assertions ×1
browser ×1
electron ×1
line-numbers ×1
logging ×1
testing ×1
typescript ×1
unit-testing ×1