2012-10-16 32 views
6

我最近試圖將文件導入到我現有的node.js項目中。我知道這應該與模塊被寫入,但我有我的外部JavaScript這樣的文件:用fs.readFileSync和eval內容讀取文件...哪個範圍具有這些功能?如何訪問?

eval(fs.readFileSync('public/templates/simple.js')+'') 

simple.js的內容是這樣的:

if (typeof examples == 'undefined') { var examples = {}; } 
if (typeof examples.simple == 'undefined') { examples.simple = {}; } 


examples.simple.helloWorld = function(opt_data, opt_sb) { 
var output = opt_sb || new soy.StringBuilder(); 
output.append('Hello world!'); 
return opt_sb ? '' : output.toString(); 
}; 

(是的,谷歌關閉模板) 。

我現在可以使用調用模板文件:

examples.simple.helloWorld(); 

一切工作像預期。然而,我無法弄清楚這些函數的範圍是什麼,以及我可以訪問示例對象的位置。

一切都運行在一個node.js 0.8服務器,就像我說的工作......我只是不知道爲什麼?

感謝您的澄清。

回答

9

eval()將變量放入您調用它的地方的本地範圍。

就好像eval()被字符串參數中的代碼所取代。

我建議改變文件的內容:

(function() { 
    ... 
    return examples; 
})(); 

這樣的話,你可以說:

var result = eval(file); 

,這將是明顯的一切是/結束。

注:eval()是一個巨大的安全風險;確保您只能從可信來源閱讀。

+0

非常感謝您的評論。你是正確的使用包裝函數。因爲我無法修改我使用的文件var examples = eval('(function(){'+ fs.readFileSync('public/templates/simple.js')+'return examples;})();' );!那麼至少我不必擔心會污染我的本地命名空間或覆蓋應該提高安全性的東西。也只返回「已知」部分。我以某種方式找到了節點本身的範圍問題的答案......因爲每個模塊都被封裝在一個匿名範圍內,所以我真的不能從全局[「例子」]的文件內部訪問任何函數...... – Johnnycube

+0

所以基本問題是node.js模塊範圍沒有顯示這些該死的功能......我如何通過名稱訪問它們? 再次感謝您的澄清 – Johnnycube

+0

與以前相同的答案:您必須將它們放入本地範圍。如果你需要將'foo.bar'看作'bar',那麼你可以簡單地說'var bar = foo.bar;'。 'eval()'可以看到'bar'。 –

相關問題