2012-03-09 2 views
3

ОК, я немного в тупике.Как работает объект require, определенный внутри работы node.js?

Если вы откроете окно узла и тип this.require вы получаете:

[Function: require] 
resolve: [Function], 
main: undefined, 
extensions: 
{ '.js': [Function], 
    '.json': [Function], 
    '.node': [Function] }, 
registerExtension: [Function], 
cache: {} } 

Это означает, что функция require(args) была создана, как, скажем, require=function(){return resultOfOperation}

Потом кто-то пошел вперед и сказал: require.cache={} Я Все ли это хорошо, но является ли кеш-объект каким-либо использованием функции require(args)? источники requirejs вообще не упоминают об объекте кэша, поэтому мне интересно, запущен ли я в другой загрузчик модулей или это просто то, что nodejs использует для отслеживания других действий.

Вопрос, «Может/(как может) функция, которой были назначены дополнительные свойства, доступ к этим свойствам изнутри исполняемого тела кода?» (желательно без знания превосходной функции)

Примечание: я понимаю, что это возможно просто записано в движок в C++, мне просто интересно узнать, могут ли люди придумать способ сделать это в javascript

+0

Вы смотрели на исходный код ? https://github.com/joyent/node/blob/v0.7.5/src/node.js#L453 –

ответ

4

Во-первых, кажется, есть некоторые путаницы. Node's require является неRequireJS. Это две совершенно разные вещи.

Чтобы узнать больше о модульной системе узла, here are the relevant docs. Вот docs on require.

Чтобы ответить на ваш второй вопрос, функции в javascript являются объектами.Один из способов сделать что-то вроде того, что вы описали выше:

var foo = function() { 
    console.log(foo.cache); 
}; 

foo.cache = { 
    bar: 1 
}; 

foo(); 
// Outputs { bar: 1 } 

Другой способ использует осуждаетсяarguments.callee (так что не делайте это дома):

var foo = function() { 
    console.log(arguments.callee.cache); 
}; 

foo.cache = { 
    bar: 1 
}; 

foo(); 
// Outputs { bar: 1 } 
+0

Я не знал о 'arguments.callee', но это обеспечило бы именно то, что я искал ... вздох, знак того, что то, что я надеялся сделать, на самом деле немой – lostinplace

4

Ваш последний вопрос:

Can/(Как может) функция, которая назначена дополнительные свойства к этим свойствам внутри исполнительного органа кода?

Вы можете использовать глобальное имя функции. Например

var myFunc = function() { 
    console.log(myFunc.a++); 
} 
myFunc.a = 1; 
myFunc(); 
myFunc(); 

Выведет

1 
2 

Теперь ваш другой вопрос

Я прекрасно со всем этим, но является объектом кэш любого использования Требовать (арг) функция?

Да, require.cache используется, поэтому при загрузке в два раза того же модуля он возвращает тот же объект и на самом деле не загружает скрипт. Проверьте документацию node.js по адресу require.cache: http://nodejs.org/api/globals.html#globals_require_cache

+0

кажется очевидным, когда вы так выразились. Я надеялся, что смогу сделать это агностик имени функции (например, с ключевым словом this), но это работает так же хорошо. – lostinplace

+0

Ключевое слово 'this' не безопасно, поскольку используется' myFunc.apply ({}) 'изменит область действия. – seppo0010

 Смежные вопросы

  • Нет связанных вопросов^_^