在 JS 中声明函数:命名和未命名表达式
Declaring functions in JS: Named and Unamed expression
最近我开始研究 JS 库 Typeahead
作为预测搜索框的解决方案。然而,在查看实现它的代码后,我开始更深入地研究事情,这让我在 javascript
.
中声明函数
我知道有 3 种主要方法可以实现此目的:
- 函数声明
- 函数表达式
- 函数构造
仔细观察 function expressions
,然后它把我带到了 anonymous functions
。我对这些的理解是,它们实际上是没有名字的function expression
?
我的问题是关于命名函数表达式和匿名函数之间的区别,为什么我会选择使用匿名函数?匿名函数有什么好处(如果有的话)?
如果您看到下面的内容(我知道这是一个非常非常简单的示例),它们似乎做的事情几乎完全相同?我似乎无法区分它们。
//Named function expression
var add = function add(a,b){
var result = a+b;
console.log('adding ' + a + ' and ' + b + ' = ' + result);
}
add(6,2);
//Anonymous function expression
var multiply = function(a,b){
var result = a*b;
console.log('multiplying ' + a + ' by ' + b + ' = ' + result);
};
multiply(10,6);
//Named function called immediately
var divide = function myfunction(a,b){
var result = a/b;
console.log('dividing ' + a + ' by ' + b + ' = ' + result);
}(10,5);
//Anonymous function called immediately
var subtract = function (a,b)
{
var result = a - b;
console.log('subtracting ' + b + ' from ' + a + ' = ' + result);
}(10,5);
附带说明一下,这是导致我写这篇文章的问题:
作者在代码中使用了匿名函数。无论如何,如果有人能为我解决这个问题,我将不胜感激。另外,在你问之前,我确实用谷歌搜索了这个,并被带到各种不同的网站,概述了差异,但我更愿意在这里问社区。
命名函数表达式可以递归调用自身。此外,它们的名称会显示在堆栈跟踪中,这有助于调试。
除此之外,这只是代码风格问题。
虽然它主要是样式,但它可能会有所不同,具体取决于何时您需要使用您的功能(API 身份验证和调用)。
使用函数表达式样式 var add = function add(a,b)
,函数在被调用之前不会实际分配给 add
。
使用function add()
,立即提升函数声明并分配给添加的函数。
简而言之,函数声明可以随时调用,而函数表达式不能 在声明之前被调用。
试试这个:
add1(5);
var add1 = function(num) {
return num + 1;
};
然后这个:
添加 2(7);
function add2(num) {
return num + 2;
};
最近我开始研究 JS 库 Typeahead
作为预测搜索框的解决方案。然而,在查看实现它的代码后,我开始更深入地研究事情,这让我在 javascript
.
我知道有 3 种主要方法可以实现此目的:
- 函数声明
- 函数表达式
- 函数构造
仔细观察 function expressions
,然后它把我带到了 anonymous functions
。我对这些的理解是,它们实际上是没有名字的function expression
?
我的问题是关于命名函数表达式和匿名函数之间的区别,为什么我会选择使用匿名函数?匿名函数有什么好处(如果有的话)?
如果您看到下面的内容(我知道这是一个非常非常简单的示例),它们似乎做的事情几乎完全相同?我似乎无法区分它们。
//Named function expression
var add = function add(a,b){
var result = a+b;
console.log('adding ' + a + ' and ' + b + ' = ' + result);
}
add(6,2);
//Anonymous function expression
var multiply = function(a,b){
var result = a*b;
console.log('multiplying ' + a + ' by ' + b + ' = ' + result);
};
multiply(10,6);
//Named function called immediately
var divide = function myfunction(a,b){
var result = a/b;
console.log('dividing ' + a + ' by ' + b + ' = ' + result);
}(10,5);
//Anonymous function called immediately
var subtract = function (a,b)
{
var result = a - b;
console.log('subtracting ' + b + ' from ' + a + ' = ' + result);
}(10,5);
附带说明一下,这是导致我写这篇文章的问题:
作者在代码中使用了匿名函数。无论如何,如果有人能为我解决这个问题,我将不胜感激。另外,在你问之前,我确实用谷歌搜索了这个,并被带到各种不同的网站,概述了差异,但我更愿意在这里问社区。
命名函数表达式可以递归调用自身。此外,它们的名称会显示在堆栈跟踪中,这有助于调试。
除此之外,这只是代码风格问题。
虽然它主要是样式,但它可能会有所不同,具体取决于何时您需要使用您的功能(API 身份验证和调用)。
使用函数表达式样式 var add = function add(a,b)
,函数在被调用之前不会实际分配给 add
。
使用function add()
,立即提升函数声明并分配给添加的函数。
简而言之,函数声明可以随时调用,而函数表达式不能 在声明之前被调用。
试试这个:
add1(5);
var add1 = function(num) {
return num + 1;
};
然后这个: 添加 2(7);
function add2(num) {
return num + 2;
};