我们在 JavaScript 中提到的两个函数声明之间有什么区别吗
//Declaration 1
var foo = function(){
// code goes here
}
和
//Declaration 2
function foo(){
// same code here
}
当我尝试使用 foo 的定义作为类来创建其他对象时
var newObj = new foo();
宣言 2 有效,但宣言 1 不允许我创建这种类型的对象
我们在 JavaScript 中提到的两个函数声明之间有什么区别吗
//Declaration 1
var foo = function(){
// code goes here
}
和
//Declaration 2
function foo(){
// same code here
}
当我尝试使用 foo 的定义作为类来创建其他对象时
var newObj = new foo();
宣言 2 有效,但宣言 1 不允许我创建这种类型的对象
这是一个函数表达式:
//Declaration 1
var foo = function(){
// code goes here
}
这是一个标记函数:
//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');}
//Declaration 1
var foo1 = function(){
alert('Declaration 1');
}
//Declaration 2
function foo(){
alert('Declaration 2');
}
var b= new foo1();
var a=new foo();
您可以创建函数对象。在您的情况下,声明 1 认为 foo 是一个变量,因此您不能创建任何变量的对象,这就是声明 2 有效而声明 1 不允许您的原因。
首先创建一个分配函数的局部变量。第二个声明创建一个函数。在第一种情况下,没有可供客户端使用的功能。这就是你不能创建对象的原因。
第一个创建一个匿名(无名)函数并将其分配给一个名为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