English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
require используется для загрузки кода, а exports и module.exports используются для экспорта кода. Но многие новички могут быть смущены различием между exports и module.exports, чтобы лучше понять их взаимосвязь,我们先巩固一下 основы js. Пример:
app.js
var a = {name: 'nswbmw 1'}; var b = a; console.log(a); console.log(b); b.name = 'nswbmw 2'; console.log(a); console.log(b); var b = {name: 'nswbmw 3'}; console.log(a); console.log(b);
Результат выполнения app.js:
{ name: 'nswbmw 1' } { name: 'nswbmw 1' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 3' }
Оставим это объяснение на потом:a является объектом, b является ссылкой на a, то есть a и b указывают на один и тот же объект, то есть a и b указывают на одно и то же место в памяти, поэтому первые два вывода одинаковые. При изменении b, то есть при изменении содержимого места в памяти, на которое указывают a и b, a также изменяется, поэтому третий и четвертый выводы одинаковые. При полном покрытии b указывает на новое место в памяти (прежний блок памяти не изменяется), а a все еще указывает на прежний блок памяти, то есть a и b больше не указывают на одно и то же место в памяти, то есть в этот момент a и b больше не связаны, поэтому последние два вывода различаются.
После того как мы поняли приведенные примеры, перейдем к основному вопросу.
Чтобы понять разницу между exports и module.exports, нам нужно знать всего три вещи:
Таким образом: мы через
var name = 'nswbmw'; exports.name = name; exports.sayName = function() { console.log(name); {}
Ассигнование значения exports на самом деле добавляет два свойства к пустому объекту module.exports,上面的 код эквивалентен:
var name = 'nswbmw'; module.exports.name = name; module.exports.sayName = function() { console.log(name); {}
Мы обычно используем exports и module.exports следующим образом
Пример, который можно использовать, чтобы вычислить площадь круга:
Использование exports
app.js
var circle = require('./circle'); console.log(circle.area(4));
circle.js
exports.area = function(r) { возврат r * r * Math.PI; {}
Использование module.exports
app.js
var area = require('./area'); console.log(area(4));
area.js
module.exports = function(r) { возврат r * r * Math.PI; {}
Результат вывода в предыдущих примерах одинаковый. Вы, возможно, спросите, почему не так?
app.js
var area = require('./area'); console.log(area(4));
area.js
exports = function(r) { возврат r * r * Math.PI; {}
Запуск предыдущего примера вызовет ошибку. Это потому, что, добавляя свойства к exports, мы только изменяем память, указываемую exports, а
exports = function(r) { возврат r * r * Math.PI; {}
Действительно, это покрытие exports, что означает, что exports указывает на новый участок памяти (содержимое - функция вычисления площади круга), что означает, что exports и module.exports больше не указывают на один и тот же участок памяти, что означает, что в этот момент exports и module.exports не имеют никакого отношения друг к другу, что означает, что участок памяти, указываемый module.exports, не был изменен и по-прежнему является пустым объектом {} , что означает, что area.js экспортировал пустой объект, поэтому при вызове area(4) в app.js возникает ошибка TypeError: object is not a function .
Таким образом, кратко подвести итог: когда мы хотим экспортировать объект модуля, мы можем использовать exports и module.exports (но exports также не может быть повторно покрыт новым объектом), а когда мы хотим экспортировать интерфейс, не являющийся объектом,我们必须 и только можем покрыть module.exports.
Мы часто видим такой стиль записи:
exports = module.exports = somethings;
Этот код эквивалентен
module.exports = somethings; exports = module.exports;
Причина также очень проста, module.exports = somethings является покрытием module.exports, в этот момент разрывается связь между module.exports и exports, module.exports указывает на новый блок памяти, а exports все еще указывает на исходный блок памяти, чтобы module.exports и exports снова указывали на один и тот же блок памяти или объект, поэтому мы exports = module.exports.
Вот и все, что есть в этой статье, надеюсь, что содержание статьи принесет вам определенную пользу в изучении или работе, и также надеюсь на вашу поддержку и крики урока!
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат их законным владельцам, материалы предоставлены пользователями Интернета в порядке добровольного участия и самостоятельной загрузки, сайт не обладает правами собственности, не underwent редактирование, и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для подачи жалоб, и предоставьте соответствующие доказательства. При подтверждении факта нарушения, сайт немедленно удалят涉嫌侵权的内容。