2014-07-02 10 views
5

मैं राइनो पुस्तक से जावास्क्रिप्ट सीखने की कोशिश कर रहा हूं। मैं 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' 

हालांकि, मैं एक ReferenceErrorg() समारोह के अंदर जब वहाँ geval() अन्य नाम का उपयोग करने का प्रयास है मिल ईएस 5 के अनुसार पारित स्ट्रिंग का मूल्यांकन वैश्विक-दायरे में किया जाता है। हालांकि, मैं ReferenceError में भाग रहा हूं और समझने में असमर्थ क्यों हूं।

हालांकि मैं eval() पर एक महत्वपूर्ण विशेषता होने पर विचार नहीं करता, मैं निश्चित रूप से समझना चाहता हूं कि मुझे इस व्यवहार का सामना क्यों करना है।

पीएस जब मैं Google क्रोम में एक ही कोड निष्पादित करने का प्रयास करता हूं, तो यह एक आकर्षण की तरह काम करता है! अजीब!

उत्तर

4

मुद्दा यह है कि आप एक मॉड्यूल है, से इस कोड को चला रहे हैं, जिसमें var y = global; वास्तव में y में मॉड्यूल गुंजाइश, नहीं वैश्विक क्षेत्र को परिभाषित करता है।

ब्राउज़र में, शीर्ष-स्तरीय दायरा वैश्विक दायरा है। इसका मतलब है कि यदि आप वैश्विक दायरे में हैं तो ब्राउज़र में var कुछ वैश्विक चर परिभाषित करेगा। नोड में यह अलग है। शीर्ष-स्तरीय दायरा वैश्विक दायरा नहीं है; एक नोड मॉड्यूल के अंदर var कुछ मॉड्यूल के के लिए स्थानीय होगा।

http://nodejs.org/api/globals.html#globals_global

तो, दो संभव तरीके इसे पाने के लिए नोड में काम करने के लिए कर रहे हैं:

  1. यह भागो के रूप में REPL
  2. भागो यह एक मॉड्यूल में नोड में है, लेकिन की जगह `काम; var y = global; सिर्फ y = global;
+0

साथ तो फिर' console.log (च(), x) करता है? – thefourtheye

+2

क्योंकि उस मामले में, 'eval' को * सीधे * कहा जाता है, इसलिए इसे उसी दायरे में निष्पादित किया जाता है कि' var x = 'local'; 'में परिभाषित किया गया है। (Http://perfectionkills.com/global-eval- 'eval' को सीधे और अप्रत्यक्ष रूप से कॉल करने के बीच भेद के लिए विकल्प क्या हैं।) – Emmett

+2

धन्यवाद जो प्रश्न का उत्तर देता है। तो एक 'var y =' global ';' वास्तव में एक मॉड्यूल स्कोप्ड चर बना रहा है और इसलिए 'geval (' y + = "बदला"; ')' वास्तव में वैश्विक दायरे में 'y' नहीं ढूंढ पा रहा है। – codematix

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