मैं राइनो पुस्तक से जावास्क्रिप्ट सीखने की कोशिश कर रहा हूं। मैं eval()
के संबंध में पुस्तक से निम्नलिखित कोड निष्पादित करने का प्रयास कर रहा था। मैं उदाहरण निष्पादित करने के लिए node.js (v0.10.29) का उपयोग कर रहा हूँ।Node.js वैश्विक eval, संदर्भ त्रुटि फेंकने
undefined:1
y += "changed";
^
ReferenceError: y is not defined
at eval (eval at g (/Users/codematix/Learning/learnjs/expressions.js:148:3), <anonymous>:1:1)
at eval (native)
at g (/Users/codematix/Learning/learnjs/expressions.js:148:3)
at Object.<anonymous> (/Users/codematix/Learning/learnjs/expressions.js:153:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
मैं क्या समझ से, जब मैं में eval()
geval()
के रूप में, कोड उपनाम:
var geval = eval; // aliasing eval to geval
var x = 'global'; // two global variables
var y = 'global';
function f() {
var x = 'local'; // define a local variable
eval('x += "changed";'); // direct eval sets the local variable
return x;
}
function g() {
var y = 'local'; // define a local variable
geval('y += "changed";'); // indirect eval sets global variable
return y;
}
console.log(f(), x); // => expected 'localchanged global'
console.log(g(), y); // => expected 'local globalchanged'
हालांकि, मैं एक ReferenceError
g()
समारोह के अंदर जब वहाँ geval()
अन्य नाम का उपयोग करने का प्रयास है मिल ईएस 5 के अनुसार पारित स्ट्रिंग का मूल्यांकन वैश्विक-दायरे में किया जाता है। हालांकि, मैं ReferenceError
में भाग रहा हूं और समझने में असमर्थ क्यों हूं।
हालांकि मैं eval()
पर एक महत्वपूर्ण विशेषता होने पर विचार नहीं करता, मैं निश्चित रूप से समझना चाहता हूं कि मुझे इस व्यवहार का सामना क्यों करना है।
पीएस जब मैं Google क्रोम में एक ही कोड निष्पादित करने का प्रयास करता हूं, तो यह एक आकर्षण की तरह काम करता है! अजीब!
साथ तो फिर' console.log (च(), x) करता है? – thefourtheye
क्योंकि उस मामले में, 'eval' को * सीधे * कहा जाता है, इसलिए इसे उसी दायरे में निष्पादित किया जाता है कि' var x = 'local'; 'में परिभाषित किया गया है। (Http://perfectionkills.com/global-eval- 'eval' को सीधे और अप्रत्यक्ष रूप से कॉल करने के बीच भेद के लिए विकल्प क्या हैं।) – Emmett
धन्यवाद जो प्रश्न का उत्तर देता है। तो एक 'var y =' global ';' वास्तव में एक मॉड्यूल स्कोप्ड चर बना रहा है और इसलिए 'geval (' y + = "बदला"; ')' वास्तव में वैश्विक दायरे में 'y' नहीं ढूंढ पा रहा है। – codematix