在 ES6 中声明一个函数?

Posted

技术标签:

【中文标题】在 ES6 中声明一个函数?【英文标题】:Declaring a function in ES6? 【发布时间】:2017-03-11 02:26:42 【问题描述】:

我想将我的 javascript 代码“更新”到新的 ES6 标准,所以我查看了函数现在是如何编写的,并在我的全局函数上进行了尝试,它在“旧”es5 中看起来像这样

function logMessage(message) 
    document.getElementById("logs").innerhtml = document.getElementById("logs").innerHTML + `<li  class="item-padding">  $message </li>`

如果我没记错的话,正确的“转换”到 ES6 应该是这样的:

logMessage = message => 
    etc

但是我的 ESLint 告诉我我的 logMessage 没有定义,我在控制台中收到错误,我错过了什么吗?我是否必须在 logMessage 之前声明 varletconst

我不知道它是否重要,但我也想将这个函数从文件一导出到文件二,并在文件二的另一个函数中使用函数 logMessage,这样做时我需要记住什么?

感谢您的帮助!

编辑:感谢大家的回答对我帮助很大,解决了我的问题!

【问题讨论】:

我觉得这两个不太一样:第一个是函数声明,第二个是赋值给变量的函数表达式 相关:Arrow function vs function declaration / expressions: Are they equivalent / exchangeable? 【参考方案1】:

如果我没记错的话,到 es6 的正确“转换”应该是这样的

你错了。

Arrow functions 是一种具有不同行为的新语法。它们不是直接替代函数声明和函数表达式(两者在 ES6 中仍然存在)。

但是我的 ESLint 告诉我我的 logMessage 没有定义,我在控制台中收到错误,我错过了什么吗?我必须在 logMessage 之前声明 var、let 或 const 吗?

是的。您正在将某些内容分配给变量。 You must declare the variable first。

我也想把这个函数从文件一导出到文件二

如何定义函数与导出它的能力无关。

【讨论】:

我认为我的“答案”更像是一个示例,更适合您的答案:const logMessage = (message) =&gt; // code 可以。 () 是可选的,带有一个简单的参数 @JaromandaX 非常正确,尽管我更喜欢在此类情况下使用它们以提高可读性。 (SE 上的错误颜色编码 (:!)【参考方案2】:
function logMessage(message) 
    // etc...

... 是在 es6 中仍然完全有效的函数声明。您正在将函数声明转换为函数表达式,在 es5 中看起来像这样...

logMessage = function(message) 
    // etc...

...然后进入es6 ...

logMessage = message => 
    // etc

...所以 linting 问题不是由 es6 语法引入的,而是使用函数表达式,分配给没有 var/let/const 的变量是全局变量。原来的函数声明会被提升也有区别,但函数表达式形式必须在调用之前声明。还有一个区别是 es6 箭头函数从父作用域中保留了 this 的上下文,所以值得注意的是它们不是 100% 直接的 1 对 1 的相互映射。

简短的回答,是的,变量需要用var/let/const 声明,以避免成为全局变量,无论它是否是函数。

let logMessage = message => 
    // etc

【讨论】:

您能否在声明函数时使用let 而非const 进行详细说明?我想说一个函数应该是不可变的吧? @Roberrrt 一个函数一旦声明仍然可以被操作,所以它是可变的。毕竟,它是一个对象。 const 关键字只是防止它被进一步向下重新分配。我不认为 Billy Moon 是在“倡导”let 而不是 const,这只是他碰巧使用的声明关键字,所以它是为了说明目的,而不是“这是你必须这样做的方式”。跨度> @vlaz 我自己一直在使用const,到目前为止还没有遇到任何问题,但是将它分配给let 时可能会有一些魔法,非常感谢不过为了信息! @Roberrrt 好吧,const 不会有“问题”。除非你定义一个函数const func = x =&gt; x *2,否则如果你尝试做func = x =&gt; x +2——那会抛出一个TypeError。但是,您仍然可以执行 func.toString = () =&gt; "this is awesome" 之类的操作,这将 更改 函数 - 它不是一成不变的,但这并不是 const 的真正作用 - 它只能防止重新分配。因此,这可能导致的唯一问题是阻止您覆盖变量。无论如何,您通常很少会想要使用函数来执行此操作,因此通常没问题。

以上是关于在 ES6 中声明一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

ES6变量声明 ------ let and const

块内声明函数

es6声明一个类

ES6 之 let和const块级作用域

es6记录之一——块级作用域与函数声明

ES6 变量声明