Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构造函数中的差异:var X=function(){},var X=function X(){},和function X(){}_Javascript - Fatal编程技术网

Javascript 构造函数中的差异:var X=function(){},var X=function X(){},和function X(){}

Javascript 构造函数中的差异:var X=function(){},var X=function X(){},和function X(){},javascript,Javascript,我现在正在调试其他人的代码,当他用这两种模式定义构造函数时,我感到困惑。这两者之间有什么特别之处吗 //constructor 1 var MyObject = function(){ }; //constructor 2 var MyObject = function MyObject(){ }; 另外,像这样创建一个函数会有什么效果呢 function MyObject(){}; 我只是看了一下每个函数的特定用例。两者之间的唯一区别是后者您可以通过函数名在内部引用函数(尽管在您的例子

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

//constructor 1
var MyObject = function(){

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

};
另外,像这样创建一个函数会有什么效果呢

function MyObject(){};

我只是看了一下每个函数的特定用例。

两者之间的唯一区别是后者您可以通过函数名在内部引用函数(尽管在您的例子中,它们的名称相同)。在一些旧的IEs中,他们将这个名称泄露给了周围的范围

将它命名为检查调用堆栈之类的东西也很有用-命名函数是将要使用的名称(至少在Chrome的inspector中是这样)。

不同的选项:

1) 函数未命名,因此在中没有函数名

2) 函数已命名,因此您可以在中获得函数名,但无论如何,这是不推荐使用的

var MyObject = function MyObject (){};
实际上,(1)和(2)之间没有实际区别

3) 函数声明而不是函数表达式()

这与前面的选项不同,因为它位于实际声明之前的范围内,因此以下代码可以正常工作:

MyObject();
function MyObject() {}
但是,如果您尝试以下方法:

MyObject();
var MyObject = function(){};
你会得到一个错误


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

请参见-我决定重复投票,因为所有问题的答案都是公认答案(第二和第三种形式之间的差异)和第二流行答案(第一和第二种形式之间的差异)。作为一个构造函数对于一个普通函数来说只是一个次要的问题。对不起,我也看到了这个问题,但我确实理解了parsetime和运行时函数声明的概念,所以我试着从面向对象的角度来提问。这个措辞有点。。crummy(最好将函数声明视为一个函数,该函数在输入包含范围后,在执行任何其他代码之前,立即创建并绑定到本地标识符,并且忘记“解析时间”)。请看,然后将其与其他答案相平衡;as“OOP”仅在函数被视为构造函数并使用
new
调用时才进入。(这并不完全正确,例如“OOP”可以通过
对象实现。创建
时不使用新关键字,或者JS的[prototype]属性解析帮助更少,但这是一个离题。)使用上述任何形式创建函数是。。只是创建一个函数。我认为选项一在一般情况下是最糟糕的。它不允许向前声明或使用,它促进了不在另一个函数的顶级范围内的函数的创建(就闭包而言,这是它们被声明的最合理的地方),并且创建的函数甚至没有真实的名称。除了极少数例外,我使用第三种形式。在我的代码中,只有当我可能将“this或that function”分配给一个标识符时,才能有效地使用第一种形式,通常是为了在HoF中立即使用。@user2864740感谢您的评论,这比任何其他形式都更受欢迎,但我将解释我的想法:(a)好的代码中不应使用函数名,依赖它会破坏一切。(b) 第二种选择是更多地打字,你重复自己的动作,这样就违背了枯燥的原则。(c) 这迫使您在使用函数之前声明它,所以代码更符合逻辑。(d) 将函数赋给变量与将值赋给变量是一样的,因此语法应该相同,对象方法的语法也相同,这很有意义。那只是我的意见。。。你不必同意,我确实不同意,但我可以尊重经过深思熟虑的理性选择。
MyObject();
function MyObject() {}
MyObject();
var MyObject = function(){};