2014-03-19 60 views
0

考慮以下幾點:交叉模塊功能範圍?它在哪裏尋找

include.js

module.exports = function() { 

    ... 

    return { 
     func: function(val) { 
      return Function('return ' + val + ';'); 
     } 
    } 
}() 

running.js

var outer = function() { 
    var include = require('./include.js'); 

    var x = include.func('eq'); 

    console.log(x(5, 5)); 
} 
outer() 

...這裏我願意把這樣function eq(x, y){ return x === y; },這將工作?我目前正在調用該函數的線路上獲得eval at <anonymous>; x(5,5)在這種情況下。

eqinclude.js或當它在running.js〜我知道這是示例代碼是從我的項目採取搞得很曖昧......可是,如果有可能它不喜歡,哪裏會是功能去?

OR

...它會更好,其中鍵是函數的名稱來定義的函數對象?

defaultFuncs = { 
    'eq': function(x, y){ return x === y; } 
} 
+2

幾乎每當您發現自己在考慮'新功能'時,假設有更好的方法是非常安全的。 – loganfsmyth

+0

是的,我不喜歡它;即使它是一個內部工具...我認爲defaultFuncs對象將會更好地工作。 – blakev

回答

2

通過new Function創建的函數的父範圍是全局範圍,而不是任何本地或模塊範圍。所以

global.eq = function(a,b) { return a==b }; 
function func(name) { return Function("return "+name+";"); } 

var x = func("eq"); 
var equals = x(); 
equals(5, 5) // true 

應該工作。

...最好是定義一個函數的對象,其中的鍵是函數的名稱?

肯定是的。

+0

您也可能對我的['F.js'](https://github.com/bergus/F/blob/master/F.js)感興趣,在那裏寫'var equals = F(「= =「);等於(5,5)';這可能會讓你的大型重複性對象 – Bergi

+0

嘿,謝謝!我決定去使用函數對象,因爲我不想混淆全局空間。 'F.js'應該很好,因爲這些函數是值和數據集之間的「驗證器」:) – blakev