2015-12-21 6 views
7

यहाँ एक उदाहरण है कि समस्या का सामना करना पड़ रहा हूँ दर्शाता है:=== Nashorn में झूठी लौटाता है जब दोनों संदर्भों को एक ही वस्तु की ओर इशारा करते जाना चाहिए

ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
    new String[] { "-strict" } 
); 

try { 
    engine.eval("function Foo(src) { this.src = src }; var e = { x: new Foo(\"what\") };"); 

    ScriptContext c = new SimpleScriptContext(); 
    c.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); 
    c.getBindings(ScriptContext.ENGINE_SCOPE).putAll(engine.getBindings(ScriptContext.ENGINE_SCOPE)); 

    System.out.println(engine.eval("var z = e.x; z === e.x;", c)); 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

मुझे पता कर रहा हूँ कि वस्तुओं है कि एक और संदर्भ में instantiated गया , को "विदेशी" माना जाता है और ScriptObjectMirror उदाहरण द्वारा लपेटा जा रहा है। मुझे लगता है कि यही कारण है कि मैं यहां एक समस्या में भाग रहा हूं। मेरा मानना ​​है कि जब भी x को संदर्भित किया जाता है, तो एक नया ScriptObjectMirror उदाहरण बनाया गया है;

System.out.println(engine.eval("e.x === e.x;", c)); 

वहाँ इस के चारों ओर एक रास्ता है: कि केवल बात यह है कि कोड की निम्न बिट की व्याख्या कर सकते भी false लौटने है? मैं कुछ ऐसा ढूंढ रहा हूं जो मैं जावा से कर सकता हूं ताकि इस बारे में जानने के लिए जावास्क्रिप्ट में कोड लिखने के बजाय संदर्भों/बाइंडिंग को एक निश्चित तरीके से स्थापित किया जा सके।

उत्तर

2
बस जो दूसरों यहाँ इस प्रश्न पढ़ने जा सकता है के लाभ के लिए

:

nashorn-देव openjdk ईमेल उपनाम में इस पर एक चर्चा धागा है: http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html

+0

मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं क्योंकि सुंदर ने इस व्यवहार के लिए मेलिंग सूची में एक अच्छी व्याख्या प्रदान की है। –

0

यह सुनिश्चित नहीं है कि आपने यहां दस्तावेज़ देखा है: (https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes) लेकिन यदि आपकी धारणा सही है तो आप अपने मुद्दे से बचने के लिए 'स्पष्ट स्क्रिप्ट ऑब्जेक्ट मिरर रैपिंग' का उपयोग कर सकते हैं।

+0

JavaScript ऑब्जेक्ट लिपटे रहे हैं जब आप उन्हें पारित एक विदेशी संदर्भ में, लेकिन यहां समस्या यह है कि नैशर्न में '===' रैपर उदाहरणों की तुलना करना प्रतीत होता है, न कि वास्तविक, लिपटे ऑब्जेक्ट्स। यदि यह देखता है कि यह 'ScriptObjectMirror' उदाहरण है, तो इसे आईएमओ की तुलना करने से पहले इसे खोलना चाहिए। जब तक कुछ ऐसा नहीं होता है। –

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