为什么要将函数赋值给变量而不是声明命名函数?

时间:2012-08-03 00:36:53

标签: javascript function variables

我为什么要这样做:

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

...

myfunc();

而不是:

function myfunc() { /* code */ }

...

myfunc();

使用一个优于另一个有什么好处吗?我看过两个例子都用在不同的地方。

3 个答案:

答案 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();