在Javascript中声明函数的最有效方法是什么?

时间:2015-12-09 12:50:03

标签: javascript function

我一直都知道要在javascript中声明一个函数,你应该做类似的事情:

function myfunction(fruit){
    alert('I like ' + fruit + '!');
}

或类似的东西:

var myfunction = function(fruit){
    alert('I like ' + fruit + '!');
};

然而,最近,我注意到有些人实际上将函数定义为常量:

const myfunction = fruit=> alert('I like ' + fruit + '!');

甚至使用关键字let

let myfunction = fruit=> alert('I like ' + fruit + '!');

此时我很困惑。

  • 为什么有这么多定义函数的方法?
  • 何时/何地我应该使用每一个?
  • 哪种方式更有效?

3 个答案:

答案 0 :(得分:9)

我认为这取决于您的需求。例如

这将在您的本地范围

上使用myfunction名称定义您的函数
function myfunction(fruit){
    alert('I like ' + fruit + '!');
}

另一方面,下面的代码将定义一个名为myfunction变量,它指向本地范围内的一个循环函数。

var myfunction = function(fruit){
    alert('I like ' + fruit + '!');
};

虽然下面的代码将定义当前日期所有浏览器都不支持的arrow function of ECMA6。此外,let语句声明一个块作用域局部变量,可选择将其初始化为一个值。因此,在代码块关闭后,您的myfunction变量将不会被显示。

let myfunction = fruit=> alert('I like ' + fruit + '!');

let允许您将范围有限的变量声明为使用它的块,语句或表达式。您可以阅读更多内容并查看一些examples here

正如官方文件所说:

  

const声明创建对值的只读引用。它   并不意味着它拥有的值是不可变的,只是变量   标识符无法重新分配。

const myfunction = fruit=> alert('I like ' + fruit + '!');

因此,如果您尝试重新分配myfunction,它将失败(无声)(但在Safari中不会失败)

// this will fail silently in Firefox and Chrome 
myfunction = fruit=> alert('No! I DO NOT like ' + fruit + '!');

关于letconst相似之处,MDN参考说明了

  

常量是块作用域的,就像使用let定义的变量一样   声明。常数的值不能改变   重新分配,不能重新声明。

所以,作为Aurelio de Rosa says

  

常量与使用let声明的变量共享一个特性   它们是块作用域而不是函数作用域

详细了解const here

答案 1 :(得分:1)

使用const使得函数变量(或在这种情况下为常量)不能重新分配给其他东西。因此,该功能无法修改。

使用let将函数的范围限制为它所定义的块,而var将函数的范围限制为执行上下文。如MDN所定义:

  

用var声明的变量的范围是它的当前执行上下文,它是封闭函数,或者对于在任何函数外部声明的变量,是全局的。

例如,在for循环中使用let会将该变量限制为for循环。

至于效率方面,我不知道其中任何一项会如何影响表现,但可能会有一些我不知道的细微差别。我怀疑任何人都会看到任何明显的性能差异。

答案 2 :(得分:1)

  

常量

  • 提供了对函数变量的只读引用,您可以将其视为常量函数,但不要将其视为不可变函数。
  

  • 允许您创建一个本地函数,这意味着它的作用域仅在它所在的封闭块内有效。

MDN参考:

注意:如果我没记错的话,所有浏览器都不能正确解释let和const。