1

JavaScriptファイルが縮小されたときにエラーの行番号を動的に取得することは可能ですか?

現時点では、すべてのエラーは行0で発生したものとしてログに記録されます。

4

3 に答える 3

3

いいえ。そのため、開発/デバッグ中に縮小コードを使用しないでください。

于 2012-04-10T07:45:33.173 に答える
1

縮小されたスクリプトをデバッグする理由の 1 つは、それを最適化するためにクロージャ コンパイラを使用していて、最適化プロセスがバグを引き起こした場合です。スタック トレースで列 (Chrome、IE) を提供するブラウザーの場合、次のようなことができます。

/*@const*/ //for closure-compiler
DEBUG=2 // 0=off, 1=msg:file:line:column, 2=msg:stack-trace
if(DEBUG){

/*@const @constructor*/
Object.defineProperty(window,'__stack__',{get:function(){
    try{_ფ_()}catch(e){return e.stack.split(":")}
}})

/*@const @constructor*/
Object.defineProperty(window,'__file__',{get:function(){
    var s=__stack__,l=s.length
    return (isNaN(s[l-2]))?s[l-2]:s[l-3]
}})

/*@const @constructor*/
Object.defineProperty(window,'__line__',{get:function(){
    var s=__stack__,l=s.length
    return (isNaN(s[l-2]))?s[l-1]:s[l-2]
}})

/*@const @constructor*/
Object.defineProperty(window,'__col__',{get:function(){
    var s=__stack__,l=s.length
    return (isNaN(s[l-2]))?"NA":s[l-1]
}})

/*@const @constructor*/
Object.defineProperty(window,'LOG',{
    get:function(){return out},
    set:function(msg){if(DEBUG>1)out=msg+"\t-\t"+__stack__
        else out=msg+" in file:"+__file__+" @ Line:"+__line__+", Column:"+__col__
        console.log(out)}
})
}//end if(DEBUG)

使用法: LOG="my message"「私のメッセージ」を行番号とファイルとともにコンソールに書き込むか、最後のログを取得するalert(LOG)

v8 (chrome、node.js) を使用すると、雑草をより深く理解できます。

/*@const @constructor*/ Object.defineProperty(this,'__stack',{get:function(){var o=Error['prepareStackTrace'],e=new Error,s;Error['prepareStackTrace']=function(_,s){return s},Error['captureStackTrace'](e,arguments['callee']),s=e['stack'],Error['prepareStackTrace']=o;return s}})

/*@const @constructor*/ Object.defineProperty(this,'__col__',{get:function(){return __stack[1]['getColumnNumber']()}})
/*@const @constructor*/ Object.defineProperty(this,'__eval_orig__',{get:function(){return __stack[1]['getEvalOrigin']()}})
/*@const @constructor*/ Object.defineProperty(this,'__file__',{get:function(){return __stack[1]['getFileName']()}})
/*@const @constructor*/ Object.defineProperty(this,'__func__',{get:function(){return __stack[1]['getFunctionName']()}})
/*@const @constructor*/ Object.defineProperty(this,'__function__',{get:function(){return __stack[1]['getFunction']()}})
/*@const @constructor*/ Object.defineProperty(this,'__is_constructor__',{get:function(){return __stack[1]['isConstructor']()}})
/*@const @constructor*/ Object.defineProperty(this,'__is_eval__',{get:function(){return __stack[1]['isEval']()}})
/*@const @constructor*/ Object.defineProperty(this,'__is_native__',{get:function(){return __stack[1]['isNative']()}})
/*@const @constructor*/ Object.defineProperty(this,'__is_top_level__',{get:function(){return __stack[1]['isTopLevel']()}})
/*@const @constructor*/ Object.defineProperty(this,'__line__',{get:function(){return __stack[1]['getLineNumber']()}})
/*@const @constructor*/ Object.defineProperty(this,'__method__',{get:function(){return __stack[1]['getMethodName']()}})
/*@const @constructor*/ Object.defineProperty(this,'__this__',{get:function(){return __stack[1]['getThis']()}})
/*@const @constructor*/ Object.defineProperty(this,'__type__',{get:function(){return __stack[1]['getTypeName']()}})
于 2013-03-05T10:23:19.623 に答える
1

縮小されたコードを美しくすることができます。クロムインスペクターでは、{}ボタンであり、「プリティプリント」と呼ばれます。

ただし、このコードを美化しても、元のコードが尊重されるわけではありません。

したがって、ThiefMasterが言ったことを言います: 開発/デバッグ中に縮小されたコードを使用しないでください。

于 2012-04-10T08:42:52.230 に答える