为什么NodeJS根据函数的定义位置抛出TypeError而不是函数?

时间:2017-06-16 03:26:00

标签: javascript node.js babeljs arrow-functions

我正在编译一个看起来像这样的箭头函数:

const convertToSeconds = milliseconds => Math.round( milliseconds / 1000 );

function fixAllTimestamps( record ) {
  if ( record.lastAccessTime ) { record.lastAccessTime = convertToSeconds( record.lastAccessTime ); }

  if ( record.licenseExpires ) { record.licenseExpires = convertToSeconds( record.licenseExpires ); }

  if ( record.lastModifiedAt ) { record.lastModifiedAt = convertToSeconds( record.lastModifiedAt ); }

  if ( record.createdAt ) { record.createdAt = convertToSeconds( record.createdAt ); }
}

Babel似乎做对了,因为箭头函数转换为:

var convertToSeconds = function convertToSeconds(milliseconds) {
  return Math.round(milliseconds / 1000);
};

但是,当我使用node运行此代码时,我得到了这个:

record.lastAccessTime = convertToSeconds(record.lastAccessTime);
                        ^

TypeError: convertToSeconds is not a function
    at fixAllTimestamps   (test.js:109:29)

这是一个意想不到的结果。

要解决这个问题,我可以在源代码文件的顶部定义箭头函数,在以常规Javascript方式定义任何其他函数之前,或者我可以将箭头函数定义放在{ {1}}使它成为嵌套函数。

有人知道为什么节点会像这样失败,或者我的代码实际上有问题吗?

2 个答案:

答案 0 :(得分:0)

这是因为您正在使用函数表达式而不是函数声明。如果使用函数声明,函数在文件中的顺序并不重要,如果使用函数表达式,则需要在使用之前定义函数。

而不是

"

待办事项

var convertToSeconds = function convertToSeconds(milliseconds) {
  return Math.round(milliseconds / 1000);
};

查看我的代码示例:https://runkit.com/donuts/594352eb72a32300116d5d5e 我还想指出你的函数(function convertToSeconds(milliseconds) { return Math.round(milliseconds / 1000); }; )没有返回任何内容。我假设你希望它改变记录。

答案 1 :(得分:0)

因为您要为变量分配function expression,所以需要在使用它之前对其进行定义。如果您使用普通function declaration,则会获得hoisted,因此您可以在声明之前使用它。