以下声明在Sails JavaScript应用程序中有什么影响?
var DataService = {};
module.exports = DataService;
module.exports = {
// module code
}
我知道这是一个" hack"这允许WebStorm intellisense全局识别DataService及其成员,但是在有和没有2个第一行的情况下,代码的行为是否完全相同?
韩国社交协会!
答案 0 :(得分:0)
首先,定义一个名为DataService
的变量,并将其等于空对象。之后,您将module.exports
对象分配DataService
变量的值,该变量是一个空对象。最后,您再次使用空对象覆盖module.exports
对象,但直接定义。它将具有相同的行为,因为在这两种情况下,对象具有相同的数据,这是一个空对象。
变量名DataService
用作对本地名称空间中空对象的引用。为module.exports
对象赋值给它提供变量的数据,而不是名称。例如,当您想要使用该模块时,您将需要它,
var dataService = require('./data-service');
如果DataService
是一个对象,那么您可以访问其属性
var example = dataService.example;
但在你的情况下,dataService
直接是一个空对象,而不是DataService
对象。所以你不能
var example = dataService.DataService ;
答案 1 :(得分:0)
简短回答:
可能(因为优化器)。
答案很长:
这个可怕的黑客可能不会在代码如何运作方面产生任何明显的差异。从理论上讲,您创建了一个新对象,它会占用内存空间并占用一些CPU周期,但只要您不在任何地方引用创建的对象,优化器很可能只会忽略该部分代码。 (我猜...)
建议:
尝试使用https://www.jetbrains.com/help/webstorm/2016.1/configuring-javascript-libraries.html#configure以更强大的方式注册您的库。
关于javascript中的intellisense
请注意,此行为似乎是由于Webstorm并非如此 了解JavaScript模块。对于基于node.js的 项目,在导入的上下文中声明的任何内容(如 除非您明确导出,否则DataService.js)的范围限定为该导入(文件)。 但是,同一条代码,在SCRIPT中的浏览器中运行 标记src文件,将以全局上下文结束。
当您在应用程序中声明
var DataService = {}
时,WebStorm错误地假定您将DataService变量放入全局范围,这意味着将任何其他成员(props / methods)添加到引用变量的文件将最终为您创建的DataService对象的成员。您会注意到,即使变量最终在全局范围内,这个假设也不会严格为真,因为多个文件会声明变量,从而覆盖您在文件中创建的对象。 JavaScript intellisense总是涉及一些猜测,因为语言的类型非常松散,并且在不实际执行代码的情况下无法确定对象的属性。
通常,如果您在文件中声明成员或在索引代码库中的某处声明名为
DataService
的变量,WebStorm(以及大多数其他IDE)会将其作为变量的潜在成员提出引用。您不能依靠智能感知通过静态分析来保证属性的存在,就像在Java或C#等更静态类型的语言中一样。