在ES6中声明一个功能?

时间:2016-10-28 08:23:24

标签: javascript function ecmascript-6 arrow-functions

我想"更新"我的新的ES6标准的javascript代码,所以我看看现在如何编写函数并在我的全局函数上尝试它,这在" old" ES5

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

现在,如果我没有错误,正确的转变&#34;到es6会是这样的:

logMessage = message => {
    etc
}

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

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

感谢您的帮助!

编辑:谢谢大家,答案对我帮助很大,我的问题得到解决!

2 个答案:

答案 0 :(得分:19)

function logMessage(message) {
    // etc...
}

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

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

...然后进入es6 ...

logMessage = message => {
    // etc
}

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

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

let logMessage = message => {
    // etc
}

答案 1 :(得分:18)

  

现在,如果我没错,那么es6的正确“转换”就像这样

你错了。

Arrow functions不同行为的新语法。它们是函数声明和函数表达式的直接替换(两者都存在于ES6中)。

  

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

是。你正在为变量分配一些东西。 You must declare the variable first

  

我还想将此功能从文件One导出到文件二

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