[英]Redefinition of variable in node.js
執行這個腳本:tmp.js,包含:
var parameters = {};
(1,eval)("var parameters = {a:1}");
(1,eval)(console.log(parameters));
node tmp.js
生產:
{}
如果我們注釋掉第一個語句,並再次執行腳本,我們獲得:
{ a: 1 }
全局范圍包含具有相同值的完全相同的變量,那么為什么console.log顯示不同的值?
因為您在Node中運行的所有代碼都在Node 模塊中運行,¹具有自己的范圍, 而不是全局范圍。 但是你調用eval
的方式(間接地, (1,eval)(...)
)在全局范圍內運行字符串中的代碼。 因此,您有兩個 parameters
變量:模塊中的本地變量和全局變量。 本地勝利(當它存在時)。
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
你的最后一行代碼有點奇怪:它調用console.log
,傳入parameters
,然后將返回值(將是undefined
)傳遞給eval
。 使用undefined.
調用eval
undefined.
如果最后一行是
(1,eval)("console.log(parameters)");
...它將在全局范圍內運行,而不是模塊范圍,並始終顯示全局。
這是一個沒有Node做同樣事情的例子:
(function() { var parameters = {}; (1,eval)("var parameters = {a:1}"); console.log("local", parameters); (1,eval)('console.log("global", parameters);'); })();
¹FWIW,根據文檔 ,您的代碼包含在一個如下所示的函數中:
(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});
...然后由Node執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.