मैंने देखा है कि कुछ टीमों के लिए जो मैं काम कर रहा हूं उनमें से कुछ विरासत स्क्रिप्ट्स अब मेरी टीम डोजो 1.8 में अपग्रेड करने के बाद काम नहीं कर रही थीं। विशेष रूप से, उनके द्वारा बनाए गए वैश्विक चर को और नहीं बनाया जा रहा था।दोजो 1.8 - वैश्विक चर बनाने में
मैंने चारों ओर खोद दिया और पाया कि डोजो 1.8 टीम वैश्विक चर के प्रति बहुत अधिक विरोध कर रही है। तो वास्तव में विरोध किया,, वे इसे उपयोगकर्ता उनके के अंत में निम्नलिखित कोड का उपयोग कर एक आवश्यक लिपि में एक वैश्विक चर बनाने के लिए के लिए शारीरिक रूप से असंभव बना कि आवश्यकता होती है:
req.eval =
function(text, hint){
return eval_(text + "\r\n////@ sourceURL=" + hint);
};
var eval_ = new Function('return eval(arguments[0]);');
कि अद्भुत और सभी, लेकिन पुराने है जिस कोड के साथ मैं काम कर रहा हूं उसे बदला नहीं जा सकता है, इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि इसके आसपास कैसे जाना है और इसके बजाय स्थानीय संदर्भ में eval निष्पादित करें।
सौभाग्य से, dojo.eval
अभी भी दोजो के पुराने संस्करणों से है, और यह वही है जो मैं चाहता हूं। तो मुझे बस req.eval
तक पहुंच प्राप्त करने की आवश्यकता है और कुछ मामलों में return dojo.eval(...)
या यहां तक कि केवल eval(...)
करने के लिए फ़ंक्शन को बदलने की आवश्यकता है।
समस्या यह है कि, मैं यह समझने में सक्षम नहीं हूं कि req
तक पहुंच कैसे प्राप्त करें। यहां क्या होता है:
मैं अपनी HTML फ़ाइल के शीर्ष पर स्क्रिप्ट टैग में dojo.js
शामिल करता हूं। यह अपनी स्क्रिप्ट फ़ाइल में लोड होता है।
dojo.require
मेरी अपनी फाइलों से सुलभ है। यह स्क्रिप्ट फ़ाइल में define
साथ परिभाषित किया है:
'dojo/_base/loader':function(){
define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
मुझे लगता है कि अगर जरूरी है या नहीं यकीन नहीं है। वैसे भी, dojo.require
के दायरे के अंदर, मैं injectModule
नामक कुछ देख सकता हूं, जबकि मेरी अपनी फ़ाइल में मैं नहीं कर सकता। injectModule
एक स्थानीय चर है इसलिए आप इसे this
के साथ नहीं देख सकते हैं।
req.getText(url, legacyMode!=sync, xhrCallback);
जो req.eval
को जाता है: यह है, अर्थात
(function(){ ... injectModule = function(){} ... })();
injectModule
समारोह अंदर
फ़ाइल के शुरू में एक गुमनाम समारोह में परिभाषित किया गया है, वहाँ निम्न पंक्ति है। तो injectModule
req
देख सकते हैं।
मुझे यकीन नहीं है कि क्या करना है। मेरी घृणास्पद जावास्क्रिप्ट चालों में से कोई भी मुझे स्कॉप्स के इस ग्रिडॉक पर नेविगेट करने में मदद नहीं करता है। एक अच्छी शुरुआत यह पता लगाना होगा कि injectModule
मेरी बाहरी स्क्रिप्ट फ़ाइल से dojo.require
पर कॉल कैसे करें। मैं इसे 'बाइंड' के साथ करने में सक्षम नहीं था, हालांकि, क्योंकि यह एक अज्ञात फ़ंक्शन में परिभाषित स्थानीय चर है। क्या यह भी संभव होगा?
फ़ाइल 1:
<script src="dojo.js"></script>
dojo.require(File 3);
console.log(globalVar);
फ़ाइल 2:
(function(){req.eval = unhelpful function})();
define(["require"], function(module){
dojo.require = function(x){req.eval(x)}
});
फ़ाइल 3:
globalVar = ...;
मैं
चीजों को थोड़ा आसान बनाने के लिए, यहाँ एक सारांश है फ़ाइलों 1 और 3 संशोधित कर सकते हैं, लेकिन फ़ाइल 3 वाईआई हमेशा एक वैश्विक चर की आवश्यकता होगी। मैं फ़ाइल 2 को संशोधित नहीं कर सकता। लक्ष्य बेहतर काम करने के लिए फ़ाइल 2 में req.eval
को बदलना है।
वैश्विक चर पहले की घोषणा से काम नहीं करता क्योंकि गुंजाइश परिवर्तन फ़ाइल 3 का मतलब अभी भी नहीं यह देखने के लिए सक्षम हो जाएगा।
परावर्तन और स्ट्रिंग प्रतिस्थापन काम नहीं करता क्योंकि गुंजाइश गलत है और जे एस सर्वर साइड पर न्यूनतम किया गया है।
फ़ाइल 1 से विधियों को ओवरराइट करना काम नहीं करता है क्योंकि मैं दायरे से नहीं देख सकता।
जावास्क्रिप्ट bind
समारोह का उपयोग करते हुए और साथ ही निरर्थक हो गया है।
आप फ़ाइल 3 में करने की कोशिश की 'window.globalVar = 42' है? – James
मैंने नहीं किया और वह काम किया, धन्यवाद। मैं वास्तव में समझ नहीं पा रहा हूं कि कैसे 'n = 5' और' window.n = 5' अलग हो रहा है। –