4

我为什么要这样做:

var myfunc = function() { /* code */ };

...

myfunc();

而不是这个:

function myfunc() { /* code */ }

...

myfunc();

使用其中一个有什么好处吗?我在不同的地方看到了这两个例子。

4

3 回答 3

4

据我所知,唯一的区别是匿名函数不能递归调用自己,而命名函数可以。第三种结构结合了这两种结构,即你可以有一个命名函数表达式:

var myfunc = function myfunc() { /* code */ };
于 2012-08-03T00:46:27.307 回答
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');
}
于 2012-08-03T01:33:00.873 回答
-2

有一些差异,主要是务实的。当你“var”一个函数时,通常的假设是某种“本地”范围的函数(想想嵌套函数)。当您这样做时 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();
于 2012-08-03T00:43:21.267 回答