我为什么要这样做:
var myfunc = function() { /* code */ };
...
myfunc();
而不是:
function myfunc() { /* code */ }
...
myfunc();
使用一个优于另一个有什么好处吗?我看过两个例子都用在不同的地方。
答案 0 :(得分:4)
据我所知,唯一的区别是匿名函数在命名函数可以递归时不能递归调用自身。有第三种类型的构造结合了这两种构造,即你可以有一个命名的函数表达式:
var myfunc = function myfunc() { /* code */ };
答案 1 :(得分:3)
如果正常声明函数,即使重新声明标识符,函数名称(其标识符)也不会被删除。只有当范围结束时才会删除标识符。
function myfunc() { /* code */ };
if (delete myfunc) { //will fail
alert('myfunc deleted');
} else {
alert('can not delete myfunc');
}
myfunc = null;
if (delete myfunc) { //will still fail
alert('myfunc deleted');
} else {
alert('can not delete myfunc');
}
var myfunc = null;
if (delete myfunc) { //will still fail
alert('myfunc deleted');
} else {
alert('can not delete myfunc');
}
但是,如果将函数声明分配给变量,则可以删除其标识符。当您需要创建全局函数但仅暂时使用它时,这尤其有用,以便在不再需要它时可以将其删除,或者避免使用第三方脚本对可能的标识符进行混淆。
var myfunc = function() { /* code */ };
if (delete myfunc) { //will succeed
alert('myfunc deleted');
} else {
alert('can not delete myfunc');
}
//or...
var myfunc = function myrealfunc() { /* code */ };
if (delete myfunc) { //will succeed
alert('myfunc deleted');
} else {
alert('can not delete myfunc');
}
答案 2 :(得分:-2)
存在一些差异,主要是务实。当你'变换'一个函数时,正常的假设是某种“局部”范围的函数(想象一个嵌套函数)。当您执行function myFunction() {}
时,该函数通常被假定为全局范围(尽管您也可以将其包装在匿名函数中)。
对于javascript'class',如果要创建本地范围的函数,则必须使用'var'来声明它。
var myClass = function() {
var test = function() {
//This function has local scope
}
};
添加上述评论,这是一个简单的例子。
var myVariable = resultFunction();
function resultFunction() {
return 1;
}
以上代码可以使用。但你不能做以下
var myVariable = resultFunction();
var resultFunction = function() {
return 1;
};
但你可以做到
var resultFunction = function() {
return 1;
};
var myVariable = resultFunction();