【发布时间】:2014-08-22 17:57:55
【问题描述】:
我正在尝试从 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)
据我了解,当我将 eval() 别名为 geval() 时,传递的字符串中的代码将根据 ES5 在全局范围内进行评估。但是,我遇到了ReferenceError 并且无法理解为什么。
虽然我不认为eval() 是一个关键功能,但我绝对想了解我遇到这种行为的原因。
附:当我尝试在 Google Chrome 中执行相同的代码时,它看起来就像一个魅力!奇怪!
【问题讨论】:
标签: javascript node.js scope eval ecmascript-5