我想"更新"我的新的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,有什么我必须记住的时候这样做?
感谢您的帮助!
编辑:谢谢大家,答案对我帮助很大,我的问题得到解决!
答案 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导出到文件二
如何定义函数与导出它的能力无关。