在任何Web瀏覽器中執行以下腳本將導致'wee'
被髮送到控制檯。在節點中,它發送{}
。vars在Nodejs中存儲在哪裏?
var d = 'wee';
console.log(this.d);
我意識到,在節點this
指的是在這種情況下的導出對象。我知道global
變量,這不是我想要訪問的。此外,上面的腳本也沒有在全局對象上設置d
。它到底在哪裏?在上面的腳本中,我可以通過console.log(d);
明確地訪問它,但它似乎在一些非標準空間中隱藏起來,沒有任何理由。
我也意識到,去掉var
將global
對象,這是預期的行爲雖然看起來愚蠢有var
在頂層範圍存儲在不同的地方比「裸」變量及其值上宣佈d
。我的意思是,模塊系統應該是防止全球污染的一種數字預防措施嗎?在這裏,打破模式似乎很容易,而且做一些標準工作很困難。
d
也未在module
對象上聲明。
我不必證明爲什麼我會問這個問題,但我會回答第一個巨魔來與「但你爲什麼想要做durrrr」。
var d = {};
d.bleep = 'y';
var a = Object.keys(d);
d.bloop = 'y';
d.blop = 'y';
var b = Object.keys(d);
// c = b - a;
var c = b.filter(function (item) {
if(a.indexOf(item) === -1) {
return true;
}
return false;
});
console.log(a,b,c);
在我能的d
特定對象狀態之間進行區分以同樣的方式,我應該能夠區分頂層範圍的狀態。在瀏覽器中,這是window
對象,在頂層範圍內由this
引用。我應該能夠在腳本執行之前和之後評估環境的屬性,以確定很多事情,其中之一是檢查在任意腳本的頂部範圍內聲明的函數和變量,然後可以將它們應用於導出對象。這將可以很容易地編程生成其不與應用的頂層函數和變量列表中指定whateverThisIs['varFunc']
到module.exports['varFunc']
簡單forEach
寫成模塊腳本模塊封裝...
和東西...
此行爲看起來像一個匿名函數。在一個匿名函數中,this
可能指的是window
對象,var
將不得不直接調用(因爲它們在anon func的作用域中),沒有var
關鍵字的聲明的泄漏變量可能會在window
對象處結束。我還沒有閱讀整個手冊,也許這正是發生了什麼,但是,我的印象是,每個模塊在自己的上下文(窗口)中執行,並且節點通過使用global
在模塊上下文之間傳遞消息,以及module.exports
...
我不知道。但我想知道。如果你知道,請告訴我。
它將出現在局部變量的範圍。在一個模塊中,你的代碼被封裝在一個函數中。你只是看不到它。 – 2013-03-08 05:20:57
那麼它只是一個匿名函數呢?當然? – Kastor 2013-03-08 05:24:01
是的......我不記得它是否是匿名的,但這並不重要。這是一個功能。爲該函數定義的第一個參數是'exports',並且將一個空對象傳遞給該參數。同一個對象被設置爲函數的this值。你可以用'console.log(arguments [0] === exports,arguments [0] === this);'來測試,並且你將會得到'true'。 – 2013-03-08 05:27:49