为什么在JavaScript中的函数调用后会出现点?

时间:2018-09-28 08:09:24

标签: javascript node.js express

在express.js中,为什么

.Server(app);

作为声明有效吗?

var http = require('http').Server(app);

不是require()是一个函数,而不是一个对象吗?

7 个答案:

答案 0 :(得分:0)

require函数的调用返回一个对象,其中Server是成员/字段。

答案 1 :(得分:0)

require是一个函数。但是require(...)可以是特定CommonJS模块通过module.exports = ...导出的任何东西。

此外,函数是对象。即使require(...)是一个函数,它也可能具有属性。对于Node.js中的CJS模块,提供默认导出为require(...)是常见的秘诀,而命名导出可以作为属性来访问。如果默认导出为函数,则为:

function defaultFooExport() {...}

defaultFooExport.namedFooExport = ...;

module.exports = defaultExport;

因此可以将其导入为:

const foo = require('foo');
const { namedFooExport } = require('foo');

答案 2 :(得分:0)

  

require()不是函数,不是对象吗?

require是可解析为函数的变量。

require()是一个表达式,其计算结果为不带参数调用该函数的返回值。

该返回值大概是一个对象。

答案 3 :(得分:0)

  

require()不是函数,不是对象吗?

函数是JavaScript中的对象:

console.log(function() {} instanceof Object);

函数实际上确实具有属性,最著名的是.call.apply.bind。因此,如果那是正在发生的事情,那仍然会很好。

但是,该代码未尝试访问功能Server的属性require

它访问通过调用Server 返回的值的属性require('http')。该值可以是任何类型(但可能是对象)。因此,让我们快速浏览一下以了解JavaScript中的数据类型和属性访问。


数据类型

JavaScript中有7种数据类型:

  • 布尔值
  • 号码
  • 字符串
  • 未定义
  • 符号
  • 对象

前6个所谓的“原始”类型。如您所见,我没有列出数组,函数,正则表达式,日期等。这是因为它们都是Object类型的。它们可能具有某些特殊的内部行为(例如,函数是可调用的),但它们仍然是对象。

财产访问

对象具有可以通过点表示法访问的属性:

x.y

但是,即使"foo".match(...)实际上是原始值,而不是对象,您也可以执行"foo"。这是可能的,因为JavaScript为Boolean,Number和String原语类型提供了“对象包装器”(这就是我们拥有BooleanNumberString构造函数的原因)。当您执行primitiveValue.something时,primitiveValue会在内部(临时)转换为其等效的Object。

仅当您尝试访问无法转换为对象的值的属性时,访问才会失败。

var foo = null;
foo.bar;

答案 4 :(得分:0)

此方法称为chaining/cascading methods

myarray.filter(compose(equals("find me"), MyClass.prototype.getName.bind)); 函数返回一个require,即Object将具有一个称为object的键,该键是一个函数。您可以将参数传递给require和Server函数。

一个最小的例子就是这样

Server

答案 5 :(得分:0)

今天,我尝试修复有关我们项目的javascript错误,其中许多错误是由null或未定义的值引起的。例如

Cannot read property 'render' of null
Cannot read property 'message' of undefined
o.size is not a function

require('xxx'),如果您不知道它的返回值,请在使用前进行判断。例如:

属性

if(res){
  console.log(res.message);      
  //....your statement.....
}

功能

if(o && o.size){
  console.log(o.size());
  //....your statement.....
}

答案 6 :(得分:-1)

有几种方法可以在Java脚本中完成模块模式,例如“匿名闭包”,“像JQuery模块一样全局导入”,CommonJS必需,AMD UMD等。因此,当我们通过导入使用模块或要求内部获取时对对象的引用。一旦获得对象,便通过“。”调用对象中的方法。操作员。因此,在“ var http = require('http')。Server(app);”的情况下)我们首先在var http中创建对象引用,然后通过将app作为参数传递来调用存在于该对象中的方法“ Server(app)”。 Writing Modular JavaScript With AMD, CommonJS & ES Harmony是一篇很好的文章,可以帮助您更多地了解需求和运作方式。