I am trying to learn JavaScript from the Rhino book. I was trying to execute the following code from the book with regards to eval()
. I am using node.js (v0.10.29) to execute the examples.
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'
However, I get an ReferenceError
inside the g()
function when there is an attempt to use the geval()
alias:
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._pile (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)
From what I understand, when I alias eval()
as geval()
, the code in string passed is evaluated in global-scope as per ES5. However, I am running into the ReferenceError
and unable to understand why.
Although I would not consider eval()
to be a critical feature, I definitely would like to understand why I am encountering this behavior.
P.S. When I attempt to execute the same code in Google Chrome, it seems to work like a charm! Strange!
I am trying to learn JavaScript from the Rhino book. I was trying to execute the following code from the book with regards to eval()
. I am using node.js (v0.10.29) to execute the examples.
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'
However, I get an ReferenceError
inside the g()
function when there is an attempt to use the geval()
alias:
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._pile (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)
From what I understand, when I alias eval()
as geval()
, the code in string passed is evaluated in global-scope as per ES5. However, I am running into the ReferenceError
and unable to understand why.
Although I would not consider eval()
to be a critical feature, I definitely would like to understand why I am encountering this behavior.
P.S. When I attempt to execute the same code in Google Chrome, it seems to work like a charm! Strange!
Share Improve this question asked Jul 2, 2014 at 4:10 codematixcodematix 1,3471 gold badge18 silver badges32 bronze badges1 Answer
Reset to default 7The issue is that you are running this code from a module, wherein var y = global;
actually defines y
in module scope, not global scope.
In browsers, the top-level scope is the global scope. That means that in browsers if you're in the global scope var something will define a global variable. In Node this is different. The top-level scope is not the global scope; var something inside a Node module will be local to that module.
http://nodejs/api/globals.html#globals_global
So, two possible ways to get this to work in Node are:
- Run it as is in the node REPL
- Run it in a module, but replace
var y = global;
with justy = global;