2012-03-19 20 views
20

सख्त और गैर-सख्त कोड मिश्रित किया जा सकता है। लेकिन आप कॉलर का उपयोग नहीं कर सकते हैं भले ही इसे कॉल सख्त कोड में न हो। क्या किसी को कोई कामकाज पता है?सख्त मोड से कॉलर कैसे प्राप्त करें?

(function strict(){ 
    "use strict"; 
    nonStrict();//ok 
    nonStrictCaller();//error :(
})(); 

function nonStrict(){ 
    return 011;//Octal literals are not allowed in strict mode 
} 

function nonStrictCaller(){ 
    return nonStrictCaller.caller; 
} 
+1

आप पास कर सकते हैं 'कार्य करने के लिए this', है ना? – gdoron

+0

मुझे लगता है कि तुम यहाँ देखने के लिए, विशेष रूप से टिप्पणी http://stackoverflow.com/a/280396/575527 – Joseph

+0

वैकल्पिक हल के लिए अपने कोड सख्त मोड के अनुरूप नहीं बना है में करना चाहते हो सकता है। यह सख्त मोड की बात है; * यह सख्त * है। आपके मामले में, इसका मतलब यह होगा कि कॉलर को किसी अन्य माध्यम से सुलभ बनाना, जैसे इसे नाम के रूप में नाम से गुजरना। –

उत्तर

11

यहाँ एक बुराई हैक है कि केवल वी 8 में काम करता है:

मैं इस कोशिश की। 140 bytes संस्करण:

function x(a,b,c){function d(e,f){d=f}c=(b=Error)[a='prepareStackTrace'];b.captureStackTrace(b[a]=d,x);d.stack;b[a]=c;return d} 

और कम गुप्त संस्करण

if ('captureStackTrace' in Error) { 
    void function(){ 
    function prepare(e, callsites){ 
     return callsites; 
    } 

    function stack(f){ 
     var e = {}; 
     var oldPrepare = Error.prepareStackTrace; 
     Error.prepareStackTrace = prepare; 
     Error.captureStackTrace(e, f || stack.caller); 
     e = e.stack; 
     Error.prepareStackTrace = oldPrepare; 
     return e; 
    } 

    function lastReceiver(){ 
     return stack(lastReceiver)[2].receiver; 
    } 

    var CallSite = stack()[0].constructor; 
    var callsiteMethods = {}; 

    Object.getOwnPropertyNames(CallSite.prototype).forEach(function(key){ 
     if (/^is|^get/.test(key)) { 
     callsiteMethods[key.replace(/^is|^get/, '')] = CallSite.prototype[key]; 
     } 
     callsiteMethods.location = CallSite.prototype.toString; 
    }); 

    CallSite.prototype.resolve = function resolve(){ 
     for (var k in callsiteMethods) 
     this[k] = callsiteMethods[k].call(this); 
    } 

    }(); 
} 
+3

यह क्रोम में अब काम नहीं कर रहा है। : - \ उदा। http://jsbin.com/zifadipivo/12/?v8Hack=true –

संबंधित मुद्दे