Printing a <script> tag straight into a template puts it wherever the template happens to run, which is why so many themes have jQuery loaded twice and a plugin that breaks when another one is deactivated. The dependency array is the whole point of the enqueue API.
wp_enqueue_script(
'catalogue-filters',
get_template_directory_uri() . '/js/filters.js',
array( 'jquery', 'underscore' ), // load after these
'1.4.0',
true // in the footer
);
WordPress resolves the graph and emits the handles in a valid order, so nothing needs to know what anything else requires. The version argument is the cache-buster and should change with the file, not be left at the theme version. The final true puts the tag before </body>, which is right for anything that does not need to run before first paint.