JavaScript中表达式函数后紧跟的括号有什么作用?
代码中
(Sequelize)片段的作用说明 你看到的是带new操作符的立即执行构造函数写法,末尾的(Sequelize)作用非常明确,拆解如下:
- 首先是语法层面的优先级适配:
new关键字后用括号包裹匿名函数,是为了让JS引擎正确识别语法逻辑——如果去掉这层包裹,引擎会错误解析代码优先级,无法把末尾括号和前面的匿名构造函数绑定。 - 其次是作为构造函数的实参传入:外层导出函数接收的
Sequelize模块实例,会通过这个括号传入内部匿名构造函数的形参位,供构造函数内部访问Sequelize内置的字段类型(比如Sequelize.STRING、Sequelize.INTEGER等)。这种传参方式把内外层的同名Sequelize变量做了作用域隔离,不会出现变量污染。
等价写法对比
原写法本质是省略了内部构造函数命名步骤的精简写法,和下面的常规写法逻辑完全一致:
const { cloneDeep, mapValues } = require('lodash'); module.exports = function(Sequelize) { // 先单独定义内部构造函数 function ModelParser(seqInstance) { var self = this; this.types = { 'string' : seqInstance.STRING, 'text' : seqInstance.TEXT, 'integer' : seqInstance.INTEGER, 'int' : seqInstance.INTEGER, 'decimal' : seqInstance.DECIMAL, 'date' : seqInstance.DATE, 'boolean' : seqInstance.BOOLEAN, }; this.parse = function(model) { 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实例,完成实例化后返回 return new ModelParser(Sequelize); };
这种写法没有特殊的黑魔法,只是JS里函数是一等公民,可以在定义后立刻传参调用/实例化,减少不必要的中间变量命名。
内容的提问来源于stack exchange,提问作者Claudio Andres Torres Burgos
相关产品推荐
相关产品推荐

