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

Javascript;通过赋值给变量创建的函数?,javascript,anonymous-function,Javascript,Anonymous Function,想得到一些关于这方面的信息。在编写Javascript时,我习惯于创建如下函数: function firstThing() { console.log("first"); }; 我在学习教程,看到了这个设置。使用变量赋值,然后传递匿名函数,然后。。。成为函数名。有没有理由用这种方式来代替上面的“传统”方式 var secondThing = function() { console.log("second"); }; 称呼他们是一样的: firstThing() secon

想得到一些关于这方面的信息。在编写Javascript时,我习惯于创建如下函数:

function firstThing() {
    console.log("first");
};
我在学习教程,看到了这个设置。使用变量赋值,然后传递匿名函数,然后。。。成为函数名。有没有理由用这种方式来代替上面的“传统”方式

var secondThing = function() {
    console.log("second");
};
称呼他们是一样的:

firstThing()
secondThing()

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

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


一些进一步的参考文献和。

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

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


一些进一步的参考和。

这称为函数表达式:

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!


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

这称为函数表达式:

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!


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

我记得有一天我读了一篇精彩的文章,但此刻我找不到比这更好的了——事实上,它说我错了。看来我把什么搞糊涂了。这很奇怪,因为我读的那篇文章我找不到——这两个步骤之间有很大的区别。所以,是的,似乎是提升,我很久以前就想错了:-我知道这是标记为重复的,但我感谢讨论/示例。只是为了好玩:我记得有一天我读了一篇精彩的文章,但现在我找不到比这更好的了——事实上它说我错了。看来我把什么搞糊涂了。这很奇怪,因为我读的那篇文章我找不到——这两个步骤之间有很大的区别。所以,是的,似乎是提升,我很久以前就想错了:-我知道这是标记为重复的,但我感谢讨论/示例。只是为了好玩:在Javascript中查看堆栈跟踪的首选方法是什么?在Javascript中查看堆栈跟踪的首选方法是什么?