Javascript Node.js全局评估,抛出引用错误

Javascript Node.js全局评估,抛出引用错误,javascript,node.js,scope,eval,ecmascript-5,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';

我正试图从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'
但是,当试图使用
geval()
别名时,我在
g()
函数中得到了一个
ReferenceError

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) 
未定义:1
y+=“已更改”;
^
ReferenceError:未定义y
评估时(评估时g(/Users/codematix/Learning/learnjs/expressions.js:148:3),:1:1)
评估时(本地)
在g(/Users/codematix/Learning/learnjs/expressions.js:148:3)
反对。(/Users/codematix/Learning/learnjs/expressions.js:153:3)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
位于Function.Module.runMain(Module.js:497:10)
启动时(node.js:119:16)
据我所知,当我将
eval()
别名为
geval()
时,传递的字符串中的代码将按照ES5在全局范围内求值。但是,我遇到了
ReferenceError
,无法理解原因

<>虽然我不认为<代码> Value>(代码)>是一个关键的特性,但我确实想理解为什么我会遇到这种行为。


另外,当我尝试在Google Chrome中执行相同的代码时,它似乎很有魅力!奇怪

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

在浏览器中,顶级作用域是全局作用域。也就是说 在浏览器中,如果您在全局范围var中,则会定义 全局变量。在节点中,这是不同的。顶级作用域不可用 全球范围;var节点模块中的某些内容将是本地的 那个模块

因此,使其在节点中工作的两种可能方法是:

  • 在节点中按原样运行它
  • 在模块中运行,但替换
    var y=global仅为
    y=global

  • 因为在这种情况下,
    eval
    被直接调用,所以它在与
    var x='local'相同的范围内执行在中定义。(有关直接和间接调用
    eval
    之间的区别,请参见。)谢谢您回答了这个问题。因此a
    vary='global'
    实际上正在创建一个模块作用域变量,因此
    geval('y+=“changed””)
    实际上无法在全局作用域中找到
    y
    。@Emmett+1,谢谢:-)