我正在尝试从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中执行相同的代码时,它似乎能够完美运行!奇怪!
eval
被直接调用,所以它是在定义var x ='local';
的相同作用域中执行的。(有关直接调用和间接调用eval
之间的区别,请参见http://perfectionkills.com/global-eval-what-are-the-options/。) - Emmettvar y = 'global';
实际上创建了一个模块作用域变量,因此geval('y += "changed";')
无法在全局范围内找到y
。 - codematix