Node.js Global eval,抛出ReferenceError

时间:2014-07-02 04:10:09

标签: javascript node.js scope eval ecmascript-5

我正在尝试从Rhino书中学习JavaScript。我试图从书中执行以下有关eval()的代码。我正在使用node.js(v0.10.29)来执行示例。

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()

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()时,传递的字符串中的代码将按照ES5在全局范围内进行评估。但是,我遇到了ReferenceError并且无法理解原因。

虽然我不认为eval()是一个关键功能,但我绝对想明白为什么会遇到这种行为。

P.S。当我尝试在谷歌浏览器中执行相同的代码时,它似乎就像一个魅力!奇怪!

1 个答案:

答案 0 :(得分:5)

问题是您是从模块运行此代码的,其中var y = global;实际上在模块范围中定义了y,而不是全局范围。

  

在浏览器中,顶级范围是全局范围。这意味着   在浏览器中,如果你在全局范围内var会定义一个   全局变量。在Node中,这是不同的。顶级范围不是   全球范围; Node模块中的var将是本地的   那个模块。

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

因此,在Node中使用它的两种可能方法是:

  1. 在节点REPL
  2. 中按原样运行
  3. 在模块中运行它,但只用var y = global;
  4. 替换y = global;