问题
The execution of this script: tmp.js, that contains:
var parameters = {};
(1,eval)("var parameters = {a:1}");
(1,eval)(console.log(parameters));
node tmp.js
produces:
{}
If we comment out the first statement, and execute again the script, we obtain:
{ a: 1 }
The global scope contains exactly the same variables with the same value, so why console.log displays a different value?
回答1:
Because all code you run in Node is running in a Node module,¹ with its own scope, not at global scope. But the way you're calling eval
(indirectly, (1,eval)(...)
) runs the code in the string at global scope. So you have two parameters
variables: A local one in the module, and a global one. The local one wins (when it exists).
var parameters = {}; // <== Creates a local variable in the module
(1,eval)("var parameters = {a:1}"); // <== Creates a global variable
(1,eval)(console.log(parameters)); // <== Shows the local if there is one,
// the global if not
Your last line of code is a bit odd: It calls console.log
, passing in parameters
, and then passes the return value (which will be undefined
) into eval
. Not much point in that call to eval
with undefined.
If that last line were
(1,eval)("console.log(parameters)");
...it would run at global scope, not module scope, and always show the global.
Here's an example that does the same thing without Node:
(function() {
var parameters = {};
(1,eval)("var parameters = {a:1}");
console.log("local", parameters);
(1,eval)('console.log("global", parameters);');
})();
¹ FWIW, according to the documentation, your code is wrapped in a function that looks like this:
(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});
...and then executed by Node.
来源:https://stackoverflow.com/questions/49691255/redefinition-of-variable-in-node-js