JavaScript的;通过赋值给变量创建的函数?

时间:2014-01-07 04:35:29

标签: javascript anonymous-function

想要得到一些意见。在编写Javascript时,我习惯于创建这样的函数:

function firstThing() {
    console.log("first");
};

我正在关注教程,并看到了这个设置。使用变量赋值,然后传递一个匿名函数,然后......成为函数名。是否有理由将其用于上述“传统”方式?

var secondThing = function() {
    console.log("second");
};

调用它们是一样的:

firstThing()
secondThing()

2 个答案:

答案 0 :(得分:3)

这称为函数表达式:

var foo = function() {}

这是一个函数声明:

function foo() {}

主要区别在于功能声明是“悬挂的”。在幕后,函数声明被“提升”到其作用域的顶部并分配给变量名称 - 实际上与函数表达式相同。

考虑一下:

foo(); //logs 'abc'
function() {
  console.log('abc');
}

这样可行,因为foo将被悬挂。使用函数表达式,这将失败:

foo(); //foo is not defined!
var foo = function() {
  console.log('abc');
}

关于函数表达式的一个很棒的事情是,您可以使用IIFE(立即调用的函数表达式)分配它们的值,并具有这样的私有值和函数:

var myFunc = (function() {
  function thisWillBeMyFunc() {
    doOne();
    doTwo();
    doThree();
  }

  function doOne() {
    console.log('Action 1!');
  }
  function doTwo() {
    console.log('Action 2!');
  }
  function doThree() {
    console.log('Action 3!');
  }

  return thisWillBeMyFunc;
}());

myFunc(); //logs the actions

doOne(); //error - not defined!

<强> Live demo (click).

哦,JavaScript的强大功能和灵活性!

答案 1 :(得分:1)

还有另一个区别。第一个创建一个命名函数,第二个选项将创建一个匿名函数。

当您查看堆栈跟踪时,第二个选项将显示为匿名函数,第一个选项将显示为已命名。您可以看到第一种方法在调试时如何为您提供一些见解。

其他一些参考文献herehere