javascript中表达式函数后面的括号有什么作用?

Cla*_*gos 1 javascript function parentheses node.js sequelize.js

我在 NodeJS 上有这个模块:

const { cloneDeep, mapValues } = require('lodash');

module.exports = function(Sequelize) {
  return new ( function(Sequelize) {
    /* Preserve this pointer into forEach callbacks scope */
    var self = this;

    this.types = {
      'string'  : Sequelize.STRING,
      'text'    : Sequelize.TEXT,
      'integer' : Sequelize.INTEGER,
      'int'     : Sequelize.INTEGER,
      'decimal' : Sequelize.DECIMAL,
      'date'    : Sequelize.DATE,
      'boolean' : Sequelize.BOOLEAN,
    };

    /* Convert the Agence model Syntax to Sequelize syntax */

    this.parse = function(model) {

      /* Convert model Agence attributes to Sequelize types attribs */
      function toSequelizeTypes(attributes) {
        return mapValues(attributes, function(attribute) {
          var attribSettings    = cloneDeep(attribute);
          attribSettings.type   = self.types[attribSettings.type];
          return attribSettings
        });
      }

      return {
        tableName: model.tableName,
        attributes : toSequelizeTypes(model.attributes),
        hooks : model.hooks || {},
        classMethods : model.classMethods || {},
        instanceMethods : model.instanceMethods || {}
      };
    };

  })(Sequelize);
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,return new 之前的括号结束,然后是 (Sequelize) 部分,在这里完成并最终关闭导出的主函数。(续集)有什么作用?我以前从未见过这种语法。

Kon*_*owy 5

这是一个IIFE。它是一个内联创建和运行的函数。

Sequelize只是一个参数

可以这样写

return new init(Sequelize);

function init(Sequelize) {
    /* Preserve this pointer into forEach callbacks scope */
    var self = this;

    this.types = {
      'string'  : Sequelize.STRING,
      'text'    : Sequelize.TEXT,
      'integer' : Sequelize.INTEGER,
      'int'     : Sequelize.INTEGER,
      'decimal' : Sequelize.DECIMAL,
      'date'    : Sequelize.DATE,
      'boolean' : Sequelize.BOOLEAN,
    };

    /* Convert the Agence model Syntax to Sequelize syntax */

    this.parse = function(model) {

      /* Convert model Agence attributes to Sequelize types attribs */
      function toSequelizeTypes(attributes) {
        return mapValues(attributes, function(attribute) {
          var attribSettings    = cloneDeep(attribute);
          attribSettings.type   = self.types[attribSettings.type];
          return attribSettings
        });
      }

      return {
        tableName: model.tableName,
        attributes : toSequelizeTypes(model.attributes),
        hooks : model.hooks || {},
        classMethods : model.classMethods || {},
        instanceMethods : model.instanceMethods || {}
      };
    };

  }
Run Code Online (Sandbox Code Playgroud)