构造函数的区别:var X = function (){}, var X = function X(){}和functi

Difference in constructors: var X = function (){}, var X = function X(){}, and function X(){}

本文关键字:function var functi 区别 构造函数      更新时间:2023-09-26

我现在正在调试别人的代码,当他在这两种模式下定义构造函数时,我只是感到困惑。这两者之间有什么特别的吗?

//constructor 1
var MyObject = function(){
};
//constructor 2
var MyObject = function MyObject(){
};

还有,像这样创建一个函数的效果是什么?

function MyObject(){};

不同的选项:

1)函数没有命名,所以在MyObject.toString()

中没有得到函数名称
var MyObject = function(){};

2)函数被命名,所以你在MyObject.toString()中得到一个函数名,但无论如何这是不赞成的。

var MyObject = function MyObject (){};

实际上,(1)和(2)之间没有实际差异

3)函数声明而不是函数表达式(参见主题讨论)

function MyObject() {}

这与前面的选项不同,因为它在实际声明之前就在作用域中,所以下面的代码可以正常工作:

MyObject();
function MyObject() {}

但是,如果你尝试这样做:

MyObject();
var MyObject = function(){};

你得到一个错误。

我通常只坚持选项1,因为它似乎是最合乎逻辑的

两者之间的唯一区别是后者可以通过函数名在内部引用函数(尽管在您的情况下,它们具有相同的名称)。在一些较老的ie中,它们将此名称泄露给周围的作用域。

这也是有用的东西,有它的命名,如检查调用堆栈-命名函数的名称将被使用(至少在Chrome的检查器)。