0

我们在 JavaScript 中提到的两个函数声明之间有什么区别吗

//Declaration 1
var foo = function(){

// code goes here
}

//Declaration 2
function foo(){
 // same code here
 }

当我尝试使用 foo 的定义作为类来创建其他对象时

var newObj = new foo();

宣言 2 有效,但宣言 1 不允许我创建这种类型的对象

4

5 回答 5

2

这是一个函数表达式:

//Declaration 1
var foo = function(){

// code goes here
}
  • 本例中的 func 表达式是匿名的,但分配给了 var foo。以供参考

这是一个标记函数:

//Declaration 2
function foo(){
 // same code here
 }
  • 没有任何理由对 var 进行表达式。您应该始终尝试对构造函数使用带标签的语句,这样您就可以通过其构造函数识别对象的“类型”。

  • 人们大多在需要吊装的地方使用它。提升只是意味着在定义之前调用某些东西

    非常非常简单的例子

    foo(); // alerts 'hello'
    function foo() {alert('hello');}
    V/s 
    foo(); // throws an error since foo is undefined
    var foo = function() {alert('hello');}
    
于 2013-07-29T07:46:31.757 回答
0

检查这个小提琴。它允许两个声明

//Declaration 1
var foo1 = function(){

alert('Declaration 1');
}

//Declaration 2
function foo(){
 alert('Declaration 2');
 }
var b= new foo1();
var a=new foo();
于 2013-07-29T07:28:13.327 回答
0

您可以创建函数对象。在您的情况下,声明 1 认为 foo 是一个变量,因此您不能创建任何变量的对象,这就是声明 2 有效而声明 1 不允许您的原因。

于 2013-07-29T07:29:05.173 回答
0

首先创建一个分配函数的局部变量。第二个声明创建一个函数。在第一种情况下,没有可供客户端使用的功能。这就是你不能创建对象的原因。

于 2013-07-29T07:25:52.380 回答
0

第一个创建一个匿名(无名)函数并将其分配给一个名为foo. 第二个声明了一个名为 的函数foo。通常这两种形式可以互换使用,但仍然存在一些差异。以下两个是我想到的主要区别。第一个可能对您所遇到的负责:

吊装

在第二个示例中,完整的函数定义将被提升到当前范围的顶部。所以当你写:

var a = new A();
function A() {}

JavaScript 会将其解释为:

function A(){}
var a;
a = new A();

...并且您的代码将正常工作。

然而,在第一个例子中,只有变量声明会被提升。函数体保持原样。所以这:

var a = new A();
var A = function(){};

将被解释为:

var a, A;
a = new A();
A = function(){};

这将导致错误,因为A在您尝试创建实例时仍未定义。

名称属性

正如我所说,第一个创建了一个匿名函数。这意味着,如果您尝试访问该name函数的属性,它将返回一个空字符串:

var A = function(){};
console.log(A.name) //{empty string}

在第二个示例中,您的函数具有实际名称A

function A(){}
console.log(A.name) //A
于 2013-07-29T07:43:30.867 回答