猿问

var functionName = function(){} vs function

我最近开始维护其他人的JavaScript代码。我正在修复错误,添加功能,并试图整理代码并使其更加一致。


以前的开发人员使用两种声明函数的方法,如果背后有原因,我就无法解决。


这两种方式是:


var functionOne = function() {

    // Some code

};

function functionTwo() {

    // Some code

}

使用这两种不同方法的原因是什么?每种方法的优缺点是什么?有一种方法可以通过一种方法完成,而另一种方法无法完成吗?


德玛西亚99
浏览 1214回答 5
5回答

噜噜哒

不同之处在于它functionOne是一个函数表达式,因此只在到达该行时定义,而是functionTwo一个函数声明,并且只要执行其周围的函数或脚本(由于提升)就会定义。例如,一个函数表达式:// TypeError: functionOne is not a functionfunctionOne();var functionOne = function() {  console.log("Hello!");};并且,一个函数声明:// Outputs: "Hello!"functionTwo();function functionTwo() {  console.log("Hello!");}这也意味着您无法使用函数声明有条件地定义函数:if (test) {   // Error or misbehavior   function functionThree() { doSomething(); }}上面的实际定义functionThree与... test的值无关 - 除非use strict有效,否则它只会引发错误。

慕无忌1623718

说到全局上下文,var语句和FunctionDeclaration最后都将在全局对象上创建一个不可删除的属性,但两者的值都可以被覆盖。两种方式之间的细微差别在于,当变量实例化过程运行时(在实际代码执行之前),所有声明的标识符var都将被初始化undefined,并且FunctionDeclaration自那时起使用的标识符将可用,例如: alert(typeof foo); // 'function', it's already available alert(typeof bar); // 'undefined' function foo () {} var bar = function () {}; alert(typeof bar); // 'function'分配bar FunctionExpression发生在运行时间。由a创建的全局属性FunctionDeclaration可以像变量值一样被覆盖而没有任何问题,例如: function test () {} test = null;您的两个示例之间的另一个明显区别是第一个函数没有名称,但第二个函数有它,这在调试(即检查调用堆栈)时非常有用。关于您编辑的第一个示例(foo = function() { alert('hello!'); };),这是一个未声明的作业,我强烈建议您始终使用该var关键字。使用赋值,如果没有var语句,如果在作用域链中找不到引用的标识符,它将成为全局对象的可删除属性。此外,未声明的作业ReferenceError在严格模式下投入ECMAScript 5 。必读:命名函数表达式揭秘

慕的地8271018

您在那里发布的两个代码段几乎在所有目的下都会以相同的方式运行。但是,行为的差异在于使用第一个variant(var functionOne = function() {}),该函数只能在代码中的该点之后调用。使用第二个variant(function functionTwo()),该函数可用于在声明函数的上方运行的代码。这是因为对于第一个变体,函数foo在运行时分配给变量。在第二个中,foo在解析时将该函数分配给该标识符。更多技术信息JavaScript有三种定义函数的方法。您的第一个代码段显示了一个函数表达式。这涉及使用“function”运算符来创建函数 - 该运算符的结果可以存储在任何变量或对象属性中。函数表达式就是这样强大的。函数表达式通常称为“匿名函数”,因为它不必具有名称,你的第二个例子是函数声明。这使用“function”语句来创建函数。该函数在分析时可用,并且可以在该范围内的任何位置调用。您以后仍可以将其存储在变量或对象属性中。定义函数的第三种方法是“Function()”构造函数,它在原始帖子中没有显示。不建议使用它,因为它的工作方式与eval()存在问题的方式相同。
随时随地看视频慕课网APP
我要回答