簡體   English   中英

在node.js中重新定義變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM