在ES6中声明一个功能?

Nak*_*hon 16 javascript function ecmascript-6 arrow-functions

我想把我的javascript代码"更新"到新的ES6标准,所以我看看现在如何编写函数并在我的全局函数上试用它,在"旧"es5中读取如下所示

function logMessage(message) {
    document.getElementById("logs").innerHTML = document.getElementById("logs").innerHTML + `<li  class="item-padding">  ${message} </li>`
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我没错,es6的正确"转换"将是这样的:

logMessage = message => {
    etc
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助!

编辑:谢谢大家的答案帮了我很多,我的问题解决了!

Bil*_*oon 23

function logMessage(message) {
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

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

logMessage = function(message) {
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

......然后进入es6 ......

logMessage = message => {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

...所以l6问题不是由es6语法引入的,而是使用函数表达式,赋值给没有var/let/const的变量是一个全局变量.原始函数声明也存在差异,但函数表达式形式必须在调用之前声明.还有一个不同之处在于es6箭头函数保留了父范围的上下文,因此值得注意的是它们不是100%直接1对于1彼此的映射.

简短的回答,是的,变量需要与声明var/ let/ const为了避免成为全局变量,无论是功能还是不行.

let logMessage = message => {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

  • @Roberrrt好吧,`const`不会出现"问题".除非你定义一个函数`const func = x => x*2`然后如果你试图做`func = x => x + 2` - 那就会引发一个TypeError.但是,你仍然可以做,比如,`func.toString =()=>"这太棒了"`这将_change_函数 - 它不是不可变的,但这不是'const`所做的 - 它只能防止重新分配.因此,这可能导致的唯一问题是阻止您覆盖变量.无论如何,你通常很少想要用函数做这个,所以它通常很好. (3认同)
  • 您能详细说明在声明函数时使用“let”而不是“const”吗?我想说函数应该是不可变的,对吧? (2认同)
  • @Roberrrt一旦声明了一个函数仍然可以被操作,所以它是_mutable_.毕竟,这是一个对象.`const`关键字只是阻止它被进一步重新分配.我不认为Billy Moon是"提倡"`let`而不是`const`,它只是他碰巧使用的声明关键字,所以它是出于说明目的,而不是"这就是你必须这样做的方式". (2认同)

Que*_*tin 20

现在,如果我没有错,那么es6的正确"转换"将是这样的

你错了.

箭头函数是具有不同行为的新语法.它们不是函数声明和函数表达式的直接替代品(两者都存在于ES6中).

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

是.你正在为变量分配一些东西.您必须先声明变量.

我还想将此函数从文件一导出到文件二

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

  • 我认为我的'回答'更像是一个例子,更适合你的答案:`const logMessage =(message)=> {// code}`会做的. (3认同)